๋ชฉํ
- pandas๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ concat/mergeํ๊ธฐ
- tidy ๋ฐ์ดํฐ์ ๋ํ ๊ฐ๋ ์ดํด
- melt์ pivot/pivot_table ํจ์๋ฅผ ์ฌ์ฉํ์ฌ wide์ tidy ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ณํํ ์ ์๋ค.
Pandas๋ก ๋ฐ์ดํฐ ํฉ์น๊ธฐ
์ฃผ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ค๋ฉด, ์ข
๋ชฉ๋ณ ๋ฐ์ดํฐ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ข
๋ชฉ์ ์๋ฏธํ๋์ง ์ค๋ช
ํ๋ description ๋ฐ์ดํฐ๋ก ๋๋์ด ์ง ์ ์๋ค.
ํจ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ถ์์ ํ๊ธฐ์ํด์๋ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋๋ก ํฉ์ณ์ผํ๋ค!!!
์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค 2๊ฐ์ง๋ฅผ ์๊ฐํด๋ณด๊ฒ ๋น
Concat(concatenate)
๊ฐ๋จํ๊ฒ '๋ํ๋ค' ํน์ '๋ถ์ธ๋ค'๋ผ๋ ์๋ฏธ๋ก ์๊ฐํ๋ฉด ์ดํด๊ฐ ํธํ๋ค.
๋ฌธ์ํ ๋ถ์ด๋ ๋๋
'๋ฌธ์๋ฅผ' + '๋ถ์ฌ์' == '๋ฌธ์๋ฅผ๋ถ์ฌ์'
๋ฌ๊ธ์์ง๋ง ๋ฌธ์ํ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
- ๋ถ์ด๊ธฐ : tostring, join
- ๋ถ๋ฆฌํ๊ธฐ : split
Dataframe๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด์ด๋ ํ์ ๊ธฐ์ค์ผ๋ก ๋ถ์ผ ์ ์๋ค.
- index์ column์ด ๊ฐ์ ๊ฒฝ์ฐ
- index์ column์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
์์!
import pandas as pd
x = pd.DataFrame([['AX','AY'],['BX','BY']], index = ['A','B'], columns = ['X','Y'])
y = pd.DataFrame([['AX','AZ'],['CX','CZ']], index = ['A','C'], columns = ['X','Z'])
์ผ ๋,
pd.concat([x,y]) # ๊ธฐ๋ณธ์ ์ผ๋ก ํ row(axis=0)๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ์ณ์ง๊ฒ ๋์ด์๋ค.
X Y Z
A AX AY NaN
B BX BY NaN
A AX NaN AZ
C CX NaN CZ
pd.concat([x,y], axis=1) # ์ด cloumn(axis=1)์ ๊ธฐ์ค์ผ๋ก ํฉ์น๋ค.
X Y X Z
A AX AY AX AZ
B BX BY NaN NaN
C NaN NaN CX CZ
์ฌ๋ฌ๊ฐ์ง ํ
- ๋ฐ์ดํฐ ์ ๋ฆฌ ๋, index์ column์ ์๋ก ๋ค๋ฐ๊ฟ ๋
df.T # Transpose ์ฌ์ฉ
- ๋ฐ์ดํฐ์ ์ฒซ๋ฒ์งธ ํ์ index๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋
new_header = df.iloc[0] # grab the first row for the header
df = df[1:] # take the data less the header row
df.columns = new_header # set the header row as the df header
Merge
merge๋ ๊ณตํต๋ ๋ถ๋ถ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ์น๋ ์ฉ๋!!! (concat๋ ํฉ์น๊ธด ํ์ง๋ง, ์๋ก ์๋ index ๋ฐ column์ ๋ํด์ NaN์ผ๋ก ํด์ ํฉ์ณค๋ค.)
df.merge('๋ถ์ผ๋ด์ฉ', how='(๋ฐฉ๋ฒ)', on='(๊ธฐ์ค์ผ๋ก ์ผ์ feature)')
df = df.merge(df2, how='inner', on='์นผ๋ผ1') # ์ด๋ฐ์์ผ๋ก, ๋จ df๋ฅผ ๊ธฐ์ค์ผ๋ก df2๋ฅผ ์ด๋ป๊ฒ ๋ถ์ด๋์ง ์ข
๋ฅ๊ฐ ์ฌ๋ฌ๊ฐ์ง์ด๋ค.
๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ด๋ฐ์!!!
Conditioning(์ด๊ฑด ์์๋ก ๊ฐ๋ณ๊ฒ ํ๋ฒ ๋ณด์)
์ฐ๋ฆฌ๊ฐ ์ด๋ฐ ๊ฒ ๊ถ๊ธํด์ง
- ์ฃผ์ ์ข ๋ชฉ๋ค์ ํ๊ท ์์ด์ต๋ฅ ์ ์ผ๋ง์ผ๊น
- ๋จ, ์์ด์ต๋ฅ ์ด - ์ธ ์ข ๋ชฉ์ ์ ์ธํ๊ณ ๊ณ์ฐ
- ํ ๋ง๋ณ๋ก
# ๋ฐ์ดํฐํ๋ ์ ํํฐ๋ง ์์
# type cast
df['์์ด์ต๋ฅ '] = pd.to_numeric(df['์์ด์ต๋ฅ '])
# ํํฐ๋ง ์กฐ๊ฑด (Condition) ์ค์
condition = (df['์์ด์ต๋ฅ '] > 0) # Type Cast
# () ๋ก ์์ฐ๋๊ฒ์ ์ฃผ์
## condition ์ ๊ฐ์ ์ถ๋ ฅ์ ํตํด ํ์ธํด๋ณด์ธ์.
# [ ] ์์ ์ปจ๋์
์ ์ค์ ํ๋ ๊ฒ์ผ๋ก, ์ปจ๋์
์ ๊ฐ์ด *TRUE*๋ก ํด๋นํ๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ง ์ ํ ํ ์ ์์ต๋๋ค.
df_subset = df[condition]
# ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธ
df_subset
์ด๋ ๊ฒ ๋์์ ์ ์ฉ๋ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ condition ๋ณ์์ ์๋ฃ๊ณ ๊ทธ๋ฅ ๋ฐ๋ก ์จ๋ ๋ฌด๋ฐฉ. ๋์ ์ข ์ง์ ๋ถ
condition = ( (df['์์ด์ต๋ฅ '] > 0) & (df['์์ด์ต๋ฅ '] < 10))
isin
- ์กฐ๊ธ trickyํ condition์ ์ค์ ํด๋ณด๊ธฐ(์์)
์ฆ, 'ํ ๋ง' ์นผ๋ผ์์ '์ฃผ๋ฅ' ๊ฐ์ ๊ฐ๋ ์ ๋ค๋ง ๊ณจ๋ผ์คdf[df['ํ ๋ง'].isin(['์ฃผ๋ฅ'])]
์ด๊ฑธ condition์ผ๋ก ์ฒ๋ฆฌํ๋ฉด
df[(df['ํ
๋ง'] == '์ฃผ๋ฅ')]
์ด๋ ๊ฒ ์ฐ๋ฉด ๋จ
Groupby
์๋ ์กฐ๊ฑด ์ค conditioning์ ํตํด 2๋ฒ๊น์ง๋ ์๋ฃ
- ์ฃผ์ ์ข ๋ชฉ๋ค์ ํ๊ท ์์ด์ต๋ฅ ์ ์ผ๋ง์ผ๊น
- ๋จ, ์์ด์ต๋ฅ ์ด - ์ธ ์ข ๋ชฉ์ ์ ์ธํ๊ณ ๊ณ์ฐ
- ํ ๋ง๋ณ๋ก
์ด์ 3๋ฒ์ ํ ์ฐจ๋ก
์ข
๋ชฉ ๋งค์ถ์ก ์์ด์ต๋ฅ ์ข
๋ชฉ๋ช
ํ
๋ง
0 000080 6,243 5.17 ํ์ดํธ์ง๋ก ์ฃผ๋ฅ
1 000890 205 2.15 ๋ณดํด์์กฐ ์ฃผ๋ฅ
2 005300 5,980 2.59 ๋กฏ๋ฐ์น ์ฑ ์ฃผ๋ฅ
4 035810 4,108 16.00 ์ด์งํ๋ฉ์ค ์ก๊ณ
5 136480 2,613 2.51 ํ๋ฆผ ์ก๊ณ
๋ผ๊ณ ํ ๋,
df.groupby('ํ
๋ง').์์ด์ต๋ฅ .mean()
ํ
๋ง
์ก๊ณ 9.255000
์ฃผ๋ฅ 3.303333
Name: ์์ด์ต๋ฅ , dtype: float64
์์ ๊ฐ์ด ํ ๋ง์ ๋ฐ๋ฅธ ์์ด์ต๋ฅ ์ ํ๊ท ๊ฐ์ด ๋์จ๋ค.
์ฌ๊ธฐ์ ํ๋ ๋ ์์๋๊ณ ๊ฐ๋ฉด ์ข์ ์
df_subset.groupby('ํ
๋ง').mean()
๋ผ๊ณ ํ๋ฉด
์์ด์ต๋ฅ
ํ
๋ง
์ก๊ณ 9.255000
์ฃผ๋ฅ 3.303333
๊ณผ ๊ฐ์ dataframe ํํ๊ฐ ์ถ๋ ฅ๋๋ค. ์ ๊ทธ๋ฐ๊ฑธ๊น?
์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก meanํจ์๋ ์ซ์ํ ์นผ๋ผ์ ๋ํด์๋ง ์ ์ฉ๋๋ค. ์ฌ๊ธฐ์๋ '์์ด์ต๋ฅ ' ์นผ๋ผ๋ง ์ซ์ํ์ด๋ผ ์ด๋ ๊ฒ ๋์ค๊ณ
์ค์ ๋ค๋ฅธ ์นผ๋ผ๋ ์ซ์ํ์ด ์๋ค๋ฉด ๊ทธ ์นผ๋ผ๊น์ง ์ถ๊ฐํด์ ํ
๋ง๋ฅผ ์ธ๋ฑ์ค๋ก ๋ฐ์ดํฐํ๋ ์์ด ๋์ค๊ฒ๋๋ค.
์ ์ด์ ์ค์ํ ํ์ด๋ ์์ด๋ ๋ณํ ๊ณผ์ ๋ณด์!!! ์ฌ๊ธฐ ์ ๊ณต๋ถํ์!!!
๋ค์ด๊ฐ๊ธฐ์ ์์ ๋ฐ์ดํฐ ํํ๋ฅผ ์ ๊ตณ์ด ๋ฐ๊ฟ์ผํ๋?
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ํํ์ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ ์๊ฐํ์ ์ฐ์ด๋ Seaborn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ 'Tidy ๋ฐ์ดํฐ'๋ฅผ ํ์๋ก ํ๋ค.
(๋ฌผ๋ก ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋)
Tidy ๋ฐ์ดํฐ ์ Wide ๋ฐ์ดํฐ
X,Y,Z์๊ฒ A,B๋ผ๋ ์ฝ์ ํฌ์ฌํด์ ๋ฐ์์ ์์๋ณธ๋ค.
ํ์๋ ๊ด์ธก, ์ด์๋ feature ํ ... ์์ง ์กฐ๊ธ ํท๊ฐ๋ฆฐ๋ค... ์ฐ๋ฆฌ๊ฐ ํํ ๋ณด๋ df๋ค์ด tidyํํ์ธ๊ฑด๊ฐ..? ์ข๋ ์๊ฐํด๋ณด์
wideํ ๋ฐ์ดํฐ๋ ์ค์ ๋ก ์ผ์์์ ๋ณผ ์ ์๋ ํํ
tidy๋ ์ด์ ๊ทธ๊ฑธ ์ฐ๋ฆฌ๊ฐ ๋ถ์ํ๊ธฐ ์ฉ์ดํ๊ฒ ์ ๋ฆฌํ๋ ๋๋?? ์ด๋ ๊ฒ ์ ๋ฆฌํ๋ฉด index์ 0๋ถํฐ ์ซ์๊ฐ ๋ค์ด๊ฐํ
๋ ์ฐ๋ฆฌ๊ฐ ํ์ ๋ณด๋ ๊ทธ ๋ฐ์ดํฐ๋ชจ์ต์๋ฏ?
Wide์์ Tidy๋ก
pandas์ melt ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์์ X,Y,Z/A,B ํ
์ด๋ธ์ ์์๋ก ๋ค๋ฉด
### ํ์ ์ธ๋ฑ์ค๋ฅผ ์ ํํ๊ณ , ์ด๋ฅผ ํ์ผ๋ก ์๋ก ์ถ๊ฐํฉ๋๋ค.
tidy1 = wide1.reset_index() # rownames๋ฅผ ์๋ก ์ค์
๋ฅผ ์ ์ฉํ๋ฉด
index A B
0 X NaN 2
1 Y 16.0 11
2 Z 3.0 1
์ ๊ฐ์ด ๋๋ค. ์ดํ
tidy๋ ํ ํ์, ํ observation์ ๊ฐ๊ฒ ํ๋ ๊ฒ
ํ observation์๋ ์ด๋ค ๊ฐ์ด ์์ด์ผํ ๊น
๋๊ฐ(id), ์ด๋ค feature๊ฐ์ ๊ฐ์ง๋์ง(value) Column์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
์ด๋ฅผ melt๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
### ๊ฐ ํ์ ๋ํด์ (unique identifier)๋ฅผ ํ์ธํฉ๋๋ค.
### ํ๊ฐ์ "tidy" ํ ์ด์ ๋ํด์ ํฌํจ๋์ด์ผ ํ (๊ธฐ์ค์ด ๋๋) ๋ฐ์ดํฐ๋ฅผ ์ ํํฉ๋๋ค.
tidy2 = tidy1.melt(id_vars = 'index', value_vars = ['A', 'B'])
๊ทธ๋ฌ๋ฉด
index variable value
0 X A NaN
1 Y A 16.0
2 Z A 3.0
3 X B 2.0
4 Y B 11.0
5 Z B 1.0
์ ๊ฐ์ด ๋๋ค. ๊ทธ ํ column์ ์ด๋ฆ์ ์ ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
์ ์ฌ์ง๊ณผ ๊ฐ์ ๋๋(ํ ... ์์ง ์ซ ํท๊ฐ๋ฆฌ๋ค... ์ฌ๊ธฐ ์ง์ง ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค)
Tidy์์ Wide๋ก
pivot_table ํจ์๋ melt ํจ์์ ๋ฐ๋ ์ญํ ์ ํ๋ ํจ์!
# ํ๋ผ๋ฏธํฐ์ ๋ํ ์ค๋ช
# index: unique identifier
# columns: "wide" ๋ฐ์ดํฐ์์ column๋ณ๋ก ๋ค๋ฅด๊ฒ ํ๊ณ ์ ํ๋ ๊ฐ.
# values: ๊ฒฐ๊ณผ๊ฐ์ด ๋ค์ด๊ฐ๋ ๊ณณ (wide ๋ฐ์ดํฐํ๋ ์์ ๋ด์ฉ์ ๋ค์ด๊ฐ ๊ฐ)
wide = tidy2.pivot_table(index = 'row', columns = 'column', values = 'value')
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌ๋จ
column A B
row
X NaN 2.0
Y 16.0 11.0
Z 3.0 1.0
Tidy ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ์ด์
์๋ฅผ ๋ค๋ฉด
seaborn๊ณผ ๊ฐ์ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค.
import seaborn as sns
sns.catplot(x = 'row', y = 'value', col = 'column', kind = 'bar', data = tidy1, height = 2);
์ด๋ ๊ฒ tidy ํํ์ฌ์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ ํธ๋ฆฌํ๋ค.
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]9.Bayesian Inference (0) | 2021.11.29 |
---|---|
[TIL]4.Basic Derivative (0) | 2021.11.27 |
[TIL]2.Feature Engineering (0) | 2021.11.27 |
[TIL]8.Confidence Intervals (0) | 2021.11.27 |
[TIL]7.Hypothesis Test + (0) | 2021.11.26 |