전공공부/인공지능
Pandas 3편 : Groupby
prefer_all
2022. 7. 25. 15:34
<목차>
정제되지 않은 데이터를 여러 형태로 변환하기 위해 사용되는 기능
1. Groupby
- unstack
- gropued
2. Hierarchical index
- aggregation
- transformation
- filtration
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
Groupby
- SQL groupby 명령어와 같음. 통계치를 낼 때
- split -> apply(함수 적용) -> combine 과정을 거쳐 연산함
Hierarchical index
- index가 여러 개인 경우, Groupby 명령을 통해 Hierarchical index를 생성할 수 있음
- 두 개의 column으로 groupby를 할 경우, index가 두 개 생성
df = pd.DataFrame(ipl_data)
h_index = df.groupby(["Team", "Year"])["Points"].sum()
h_index.index
'''
MultiIndex(levels=[['Devils', 'Kings', 'Riders', 'Royals', 'kings'], [2014, 2015, 2016, 2017]],
labels=[[0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4], [0, 1, 0, 2, 3, 0, 1, 2, 3, 0, 1, 1]],
names=['Team', 'Year'])
'''
h_index["Devils":"Kings"]
'''
Team Year
Devils 2014 863
2015 673
Kings 2014 741
2016 756
2017 788
Name: Points, dtype: int64
'''
unstack()
- Group으로 묶여진 데이터를 matrix 형태로 전환해줌
- 거대한 data에서 feature을 생성할 때, one-hoting encoding으로 표현할 때 이렇게 data handling
- Index level을 변경할 수 있음 .swaplevel() .sort_index()
h_index.swaplevel() #원래 Team Year이었음
'''
Year Team
2014 Devils 863
2015 Devils 673
2014 Kings 741
2016 Kings 756
2017 Kings 788
2014 Riders 876
2015 Riders 789
2016 Riders 694
2017 Riders 690
2014 Royals 701
2015 Royals 804
kings 812
Name: Points, dtype: int64
'''
h_index.swaplevel().sort_index()
'''
Year Team
2014 Devils 863
Kings 741
Riders 876
Royals 701
2015 Devils 673
Riders 789
Royals 804
kings 812
2016 Kings 756
Riders 694
2017 Kings 788
Riders 690
Name: Points, dtype: int64
'''
Groupby - gropued
- Groupby에 의해 Split된 상태를 추출 가능함
- tuple 형태로 그룹의 key 값, value 값 추출 가능
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby("Team")
for name,group in grouped:
print (name)
print (group)
'''
Devils #name
Team Rank Year Points #group
2 Devils 2 2014 863
3 Devils 3 2015 673
Kings
Team Rank Year Points
4 Kings 3 2014 741
6 Kings 1 2016 756
7 Kings 1 2017 788
Riders
Team Rank Year Points
0 Riders 1 2014 876
1 Riders 2 2015 789
8 Riders 2 2016 694
11 Riders 2 2017 690
Royals
Team Rank Year Points
9 Royals 4 2014 701
10 Royals 1 2015 804
kings
Team Rank Year Points
5 kings 4 2015 812
'''
- 특정 key값을 가진 그룹의 정보만 추출 가능
grouped.get_group("Devils")
'''
Team Rank Year Points
2 Devils 2 2014 863
3 Devils 3 2015 673
'''
- 추출된 group 정보에는 세 가지 유형의 apply가 가능함
- Aggregation: 요약된 통계정보를 추출해 줌
- Transformation: 해당 정보를 변환해줌
- Filtration: 특정 정보를 제거 하여 보여주는 필터링 기능
aggregation grouped.agg()
- 요약된 통계정보를 추출해 줌
grouped.agg(min)
'''
Rank Year Points
Team
Devils 2 2014 673
Kings 1 2014 741
Riders 1 2014 690
Royals 1 2014 701
kings 4 2015 812
'''
grouped.agg(sum)
'''
Rank Year Points
Team
Devils 5 4029 1536
Kings 5 6047 2285
Riders 7 8062 3049
Royals 5 4029 1505
kings 4 2015 812
'''
- 특정 column에 여러 개의 function을 apply 가능
grouped['Points'].agg([np.sum, np.mean, np.std])
'''
sum mean std
Team
Devils 1536 768.000000 134.350288
Kings 2285 761.666667 24.006943
Riders 3049 762.250000 88.567771
Royals 1505 752.500000 72.831998
kings 812 812.000000 NaN
'''
transformation grouped.transform()
- aggregation과 달리 key값 별로 요약된 정보가 아님
- 개별 데이터의 변환을 지원함
df
grouped = df.groupby("Team")
score = lambda x: (x.max())
grouped.transform(score)
filter .filter()
df.groupby('Team').filter(lambda x: len(x) >= 3)
#data가 세 개 이상인 경우
dateutil data를 가지고 연습