전공공부/인공지능

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)

Riders들 중 max는 point가 876일때 / Devils 들 중 max는 point가 863일때


filter .filter()

df.groupby('Team').filter(lambda x: len(x) >= 3)
#data가 세 개 이상인 경우

 

dateutil data를 가지고 연습

https://github.com/TEAMLAB-Lecture/AI-python-connect/blob/master/codes/ch_3/part-2/1_groupby_hierarchical_index.ipynb