๊ทธ๋ฃนํ
import pandas as pd
df1 = pd.DataFrame({'ID' : [1, 2, 3, 4, 5], '๊ฐ์
์ผ' : ['2021-01-02', '2021-01-04', '2021-01-10', '2021-02-10', '2021-02-24'], '์ฑ๋ณ' : ['F', 'M', 'F', 'M', 'M']})
df2 = pd.DataFrame({'๊ตฌ๋งค์์' : [1, 2, 3, 4, 5], 'ID' : [1, 1, 2, 4, 1], '๊ตฌ๋งค์' : [1, 1, 2, 2, 3], '๊ธ์ก' : [1000, 1500, 2000, 3000, 4000]})
-๋ฌธ์ : df1 ์ ํ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ฉฐ, df2 ๋ ๊ฐ ํ์์ ๊ตฌ๋งค ๋ด์ญ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ค. ๊ฐ ํ์์ ์ ๋ณด์ ๊ตฌ๋งค ๋ด์ญ์ ์ทจํฉํ์ฌ ํ๋์ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ง๋ค๊ธฐ.
pd.merge(df1, df2, how = 'left', on = 'ID')
groupby()
- groupby(๊ธฐ์ค์ด ๋๋ ์ด์ด๋ฆ) : ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃน ๋ณ๋ก ๊ตฌ๋ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํจ์
1) ์ฌ๋ฌ๊ฐ์ง ํจ์๋ฅผ ํ์ฉํ์ฌ ์ฐ์ฐ
๊ฐ๊ฐ์ column๋ค์ ๊ทธ๋ฃนํํ๊ณ ๊ทธ๋ฃนํํ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ฐ
1) count() : ๊ทธ๋ฃน ๋ด Non-NA ๊ฐฏ์
2) sum() : ๊ทธ๋ฃน ๋ด Non-NA๋ค์ ํฉ
3) min() : ์ต์๊ฐ
4) max() : ์ต๋๊ฐ
5) mean() : ํ๊ท ๊ฐ
6) std() : ํ์คํธ์ฐจ
7) var() : ๋ถ์ฐ
8) first() : ๊ทธ๋ฃน ๋ด Non-NA ๊ฐ ์ค ์ฒซ๋ฒ์งธ ๊ฐ
9) last() : ๊ทธ๋ฃน ๋ด Non-NA ๊ฐ ์ค ๋ง์ง๋ง ๊ฐ
10) describe() : ๊ทธ๋ฃน์ ๊ธฐ์ ํต๊ณ๋
-๋ฌธ์ : df1 ์ ํ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ฉฐ, df2 ๋ ๊ฐ ํ์์ ๊ตฌ๋งค ๋ด์ญ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ค. ๊ฐ ํ์์ ๋์ ๊ธ์ก์ ํ์ ID ๋ณ๋ก ๊ตฌํ๊ธฐ
df2
df2.groupby(by = ['ID'])['๊ธ์ก'].sum()
ID
1 6500
2 2000
4 3000
Name: ๊ธ์ก, dtype: int64
type(df2.groupby(by = ['ID'])['๊ธ์ก'].sum())
pandas.core.series.Series
s2 = df2.groupby(by = ['ID'])['๊ธ์ก'].sum()
pd.merge(df1, s2, how = 'left', on = 'ID')
-๋ฌธ์ : df1 ์ ํ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ฉฐ, df2 ๋ ๊ฐ ํ์์ ๊ตฌ๋งค ๋ด์ญ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ค. ๊ฐ ํ์์ ์๋ณ ๋์ ๊ธ์ก์ ํ์ ID ๋ณ๋ก ๊ตฌํ๊ธฐ.
df2
df2.groupby(by = ['ID', '๊ตฌ๋งค์'])['๊ธ์ก'].sum()
ID ๊ตฌ๋งค์
1 1 2500
3 4000
2 2 2000
4 2 3000
Name: ๊ธ์ก, dtype: int64
type(df2.groupby(by = ['ID', '๊ตฌ๋งค์'])['๊ธ์ก'].sum())
pandas.core.series.Series
s2 = df2.groupby(by = ['ID', '๊ตฌ๋งค์'])['๊ธ์ก'].sum()
s2.index
MultiIndex([(1, 1),
(1, 3),
(2, 2),
(4, 2)],
names=['ID', '๊ตฌ๋งค์'])
pd.merge(df1, s2, how = 'left', on = 'ID')
df3 = pd.DataFrame(S2)
df3
df3.index
MultiIndex([(1, 1),
(1, 3),
(2, 2),
(4, 2)],
names=['ID', '๊ตฌ๋งค์'])
pd.merge(df1, df3, how = 'left', on = 'ID')
#๊ทธ๋ฃน์ index ๋ก ์ฌ์ฉํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ์๋ as_index = False ๋ก ์ค์
df2.groupby(by = ['ID', '๊ตฌ๋งค์'], as_index = False)['๊ธ์ก'].sum()
type(df2.groupby(by = ['ID', '๊ตฌ๋งค์'], as_index = False)['๊ธ์ก'].sum())
pandas.core.frame.DataFrame
df3 = df2.groupby(by = ['ID', '๊ตฌ๋งค์'], as_index = False)['๊ธ์ก'].sum()
pd.merge(df1, df3, how = 'left', on = 'ID')
2) ํ์ฉ๋๊ฐ ๋์ ๊ณ ๊ธ ๊ทธ๋ฃน์ฐ์ฐ
- agg() : ์ฌ๋ฌ๊ฐ์ ํจ์๋ฅผ ์ฌ๋ฌ ์ด์ ์ ์ฉ
๋ชจ๋ ์ด์ ์ฌ๋ฌ ํจ์๋ฅผ ๋งคํ : group๊ฐ์ฒด.agg([ํจ์1, ํจ์2, ํจ์3, ...])
๊ฐ ์ด๋ง๋ค ๋ค๋ฅธ ํจ์๋ฅผ ๋งคํ : group๊ฐ์ฒด.agg({'์ด1' : ํจ์1, '์ด2' : ํจ์2, ...})
-๋ฌธ์ : df ๋ ๊ฐ ํ์์ ๊ตฌ๋งค ๋ด์ญ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ค. ๊ฐ ํ์์ ๋์ ๊ธ์ก๊ณผ ๋์ ๊ตฌ๋งค ํ์๋ฅผ ํ์ ID ๋ณ๋ก ๊ตฌํ๊ธฐ
df = pd.DataFrame({'๊ตฌ๋งค์์' : [1, 2, 3, 4, 5], 'ID' : [1, 1, 2, 4, 1], '๊ตฌ๋งค์' : [1, 1, 2, 2, 3], '๊ธ์ก' : [1000, 1500, 2000, 3000, 4000], '์์๋ฃ' : [100, 150, 200, 300, 400]})
df
df.groupby(by = ['ID'])['๊ธ์ก'].agg([sum, len])
df.groupby(by = ['ID'], as_index = False)['๊ธ์ก'].agg([sum, len])
- index๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๋ถํ
- set_index() : column ๋ฐ์ดํฐ๋ฅผ index๋ ๋ฒจ๋ก ๋ณ๊ฒฝ
- reset_index() : index ์ด๊ธฐํ -> ์ฐ๋ฆฌ๊ฐ ์ํ๋ column์ index๋ ๋ฒจ๋ก ๋ณ๊ฒฝ
df2 = df.groupby(by = ['ID'])['๊ธ์ก'].agg([sum, len])
df2.reset_index(inplace = True)
df2
-๋ฌธ์ : df ๋ ๊ฐ ํ์์ ๊ตฌ๋งค ๋ด์ญ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ๋ ์์ด๋ค. ๊ฐ ํ์์ ์ต๋ ์ฌ์ฉ ๊ธ์ก / ์ต์ ์ฌ์ฉ ๊ธ์ก๊ณผ ์ต์ ์์๋ฃ์ ๊ฐ์ ๊ตฌํ๊ธฐ.
df
df.groupby(by = ['ID']).agg({'๊ธ์ก' : [max, min], '์์๋ฃ' : min})
df2 = df.groupby(by = ['ID']).agg({'๊ธ์ก' : [max, min], '์์๋ฃ' : min})
df2.reset_index()
df2.columns
MultiIndex([( '๊ธ์ก', 'max'),
( '๊ธ์ก', 'min'),
('์์๋ฃ', 'min')],
)
df2.columns.values
array([('๊ธ์ก', 'max'), ('๊ธ์ก', 'min'), ('์์๋ฃ', 'min')], dtype=object)
df2.columns = ['_'.join(col) for col in df2.columns.values]
df2
df2.reset_index
๋๊ธ