ํ์ด์ฌ ๋ง์คํฐํ๊ธฐ : Group By ํจ์
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/ํ์ด์ฌ-๋ง์คํฐํ๊ธฐ-GROUP-BY
ํ์ด์ฌ ํ๋ค์ค ์ฌํ
ํ๋ค์ค(Pandas)
์์ Group By
๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ํํ๋๋ฐ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์
๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Python์์ Group By์ ๊ฐ๋ ๊ณผ ํ์ฉ ์์ ์ ๋ํด ๋ค๋ฃจ์ด๋ณด๊ฒ ์ต๋๋ค.
Group By๋?
Group By๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ํํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
Group By๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค. Pandas์์๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก Group By๋ฅผ ์ํํฉ๋๋ค.
1
df.groupby('๊ทธ๋ฃนํํ ์ด ์ด๋ฆ')
์ ์ฝ๋๋ df
๋ฐ์ดํฐํ๋ ์์ ๊ทธ๋ฃนํํ ์ด ์ด๋ฆ
์ผ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ์ด์ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์ํ๋ ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
Group By์ ํ์ฉ ์์
1. ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ธฐ๋ณธ ํต๊ณ ์ ๋ณด ๊ตฌํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
1
2
3
4
5
6
7
import pandas as pd
import numpy as np
data = {'ํ๋
': ['1ํ๋
', '1ํ๋
', '2ํ๋
', '2ํ๋
', '3ํ๋
', '3ํ๋
', '3ํ๋
'],
'์ฑ๋ณ': ['๋จ', '์ฌ', '๋จ', '์ฌ', '๋จ', '์ฌ', '์ฌ'],
'์์ด ์ฑ์ ': [80, 90, 70, 60, 85, 95, 75]}
df = pd.DataFrame(data)
์ด์ ํ๋
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ด ์ฑ์
์ ํ๊ท , ์ต์๊ฐ, ์ต๋๊ฐ ๋ฑ์ ๊ธฐ๋ณธ ํต๊ณ ์ ๋ณด๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
1
2
3
grouped = df.groupby('ํ๋
')
result = grouped['์์ด ์ฑ์ '].agg(['mean', 'min', 'max', 'count'])
print(result)
์ ์ฝ๋๋ ํ๋
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ด ์ฑ์
์ ํ๊ท , ์ต์๊ฐ, ์ต๋๊ฐ, ๊ฐ์ ๋ฑ์ ๊ธฐ๋ณธ ํต๊ณ ์ ๋ณด๋ฅผ ๊ตฌํฉ๋๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
2. ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ์๊ฐํ
๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
1
2
3
4
data = {'Location': ['Seoul', 'Seoul', 'Seoul', 'Geongi', 'Geongi', 'Geongi', 'Incheon', 'Incheon', 'Incheon'],
'Year': [2018, 2019, 2020, 2018, 2019, 2020, 2018, 2019, 2020],
'Population': [9700000, 9800000, 9900000, 13000000, 13500000, 14000000, 2900000, 3000000, 3100000]}
df = pd.DataFrame(data)
์ด์ ์ง์ญ
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ์ธ๊ตฌ
์ ๋ณด๋ฅผ ๋ง๋๊ทธ๋ํ๋ก ์๊ฐํํด๋ณด๊ฒ ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import warnings
%matplotlib inline
grouped = df.groupby('Location')
result = grouped['Population'].sum()
result.plot(kind='bar')
plt.show()
์ ์ฝ๋๋ ์ง์ญ
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ์ธ๊ตฌ
์ ๋ณด๋ฅผ ๋ง๋๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ๊ทธ๋ํ์์ ๋ณผ ์ ์๋ฏ์ด, ์์ธ
๊ณผ ๊ฒฝ๊ธฐ
์ง์ญ์ ์ธ๊ตฌ๊ฐ ์ฆ๊ฐํ๊ณ ์๊ณ , ์ธ์ฒ
์ง์ญ์ ์๋์ ์ผ๋ก ์ธ๊ตฌ ์ฆ๊ฐ์จ์ด ๋ฎ์ ๊ฒ์ ์ ์ ์์ต๋๋ค.
3. ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ
groupby()
ํจ์๋ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
1
2
3
4
5
6
7
import pandas as pd
import numpy as np
data = {'ํ๋
': ['1ํ๋
', '1ํ๋
', '2ํ๋
', '2ํ๋
', '3ํ๋
', '3ํ๋
', '3ํ๋
'],
'์ฑ๋ณ': ['๋จ', '์ฌ', '๋จ', '์ฌ', '๋จ', '์ฌ', '์ฌ'],
'์์ด ์ฑ์ ': [80, 90, 70, 60, 85, 95, 75]}
df = pd.DataFrame(data)
์ด์ ํ๋
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ด ์ฑ์
์ ํ๊ท ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
1
2
3
grouped = df.groupby('ํ๋
')
result = grouped['์์ด ์ฑ์ '].mean()
print(result)
์ ์ฝ๋๋ ํ๋
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ด ์ฑ์
์ ํ๊ท ์ ๊ตฌํฉ๋๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1
2
3
4
5
ํ๋
1ํ๋
85.0
2ํ๋
65.0
3ํ๋
85.0
Name: ์์ด ์ฑ์ , dtype: float64
4. ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ํผ๋ฒ ํ ์ด๋ธ ์์ฑ
pivot_table()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ํผ๋ฒ ํ
์ด๋ธ์ ์์ฑํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
1
2
3
4
5
data = {'๊ตญ๊ฐ': ['ํ๊ตญ', 'ํ๊ตญ', '๋ฏธ๊ตญ', '๋ฏธ๊ตญ', '์ผ๋ณธ', '์ผ๋ณธ', 'ํ๊ตญ', '๋ฏธ๊ตญ', '์ผ๋ณธ'],
'์ฑ๋ณ': ['๋จ', '์ฌ', '๋จ', '์ฌ', '๋จ', '์ฌ', '๋จ', '์ฌ', '๋จ'],
'ํค': [170, 160, 180, 170, 165, 155, 175, 185, 175],
'๋ชธ๋ฌด๊ฒ': [70, 60, 80, 65, 70, 50, 75, 85, 70]}
df = pd.DataFrame(data)
์ด์ ๊ตญ๊ฐ
์ ์ฑ๋ณ
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ํค
์ ๋ชธ๋ฌด๊ฒ
์ ๋ํ ํผ๋ฒ ํ
์ด๋ธ์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
1
2
table = pd.pivot_table(df, index=['๊ตญ๊ฐ', '์ฑ๋ณ'], values=['ํค', '๋ชธ๋ฌด๊ฒ'], aggfunc=np.mean)
print(table)
์ ์ฝ๋๋ ๊ตญ๊ฐ
์ ์ฑ๋ณ
์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ํค
์ ๋ชธ๋ฌด๊ฒ
์ ๋ํ ํ๊ท ๊ฐ์ ๊ตฌํ ๋ค, ์ด๋ฅผ ํผ๋ฒ ํ
์ด๋ธ๋ก ์์ฑํฉ๋๋ค. ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ํผ๋ฒ ํ
์ด๋ธ์ ๋ณด๋ฉด, ๊ตญ๊ฐ
์ ์ฑ๋ณ
๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํด ํค
์ ๋ชธ๋ฌด๊ฒ
์ ๋ํ ํ๊ท ๊ฐ์ ๊ตฌํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ Group By์ pivot_table์ ์กฐํฉํ์ฌ ๋ค์ํ ํํ์ ๋ฐ์ดํฐ ๋ถ์์ ์ํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ ์์ ๋ฅผ ํตํด Python์์ Group By์ ๊ฐ๋ ๊ณผ ํ์ฉ ์์ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. Group By๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ํํ๋๋ฐ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋๋ค. Pandas์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค.