English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandas GroupBy的操作实例
任何groupby操作都会对原始对象进行以下操作:
拆分对象 应用函数 合并结果
在许多情况下,我们将数据分成几组,然后在每个子集上应用一些功能。在Apply功能中,我们可以执行以下操作-
聚合 − 计算汇总统计 转换 − 分组操作 필터링 − 在某些条件下过滤数据
现在我们创建一个DataFrame对象并对其执行所有操作。
#import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df)
실행 결과는 다음과 같습니다:
점수 랭킹 팀 연도 0 876 1 Riders 2014 1 789 2 Riders 2015 2 863 2 Devils 2014 3 673 3 Devils 2015 4 741 3 Kings 2014 5 812 4 kings 2015 6 756 1 Kings 2016 7 788 1 Kings 2017 8 694 2 Riders 2016 9 701 4 Royals 2014 10 804 1 Royals 2015 11 690 2 Riders 2017
象可以拆分为任何对象。有多种分割对象的方法,例如:
obj.groupby('key') obj.groupby(['key1','key2']) obj.groupby(key,axis=1)
现在我们看看如何将分组对象应用于DataFrame对象
# import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team'))
실행 결과는 다음과 같습니다:
# import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team').groups)
실행 결과는 다음과 같습니다:
{'Kings': Int64Index([4 6 7], dtype='int64'), 'Devils': Int64Index([2 3], dtype='int64'), 'Riders': Int64Index([0, 1 8 11], dtype='int64'), 'Royals': Int64Index([9 10], dtype='int64'), 'kings' : Int64Index([5], dtype='int64)}
多列分组
# import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby(['Team','Year']).groups)
실행 결과는 다음과 같습니다:
{('Kings', 2014): Int64Index([4], dtype='int64'), ('Royals', 2014): Int64Index([9], dtype='int64'), ('Riders', 2014): Int64Index([0], dtype='int64'), ('Riders', 2015): Int64Index([1], dtype='int64'), ('Kings', 2016): Int64Index([6], dtype='int64'), ('Riders', 2016): Int64Index([8], dtype='int64'), ('Riders', 2017): Int64Index([11], dtype='int64'), ('Devils', 2014): Int64Index([2], dtype='int64'), ('Devils', 2015): Int64Index([3], dtype='int64'), ('kings', 2015): Int64Index([5], dtype='int64'), ('Royals', 2015): Int64Index([10], dtype='int64'), ('Kings', 2017): Int64Index([7], dtype='int64)}
有了groupby对象,我们可以类似于itertools.obj遍历该对象。
# import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') for name,group in grouped: print(name) print(group)
실행 결과는 다음과 같습니다:
2014 점수 순위 팀 연도 0 876 1 Riders 2014 2 863 2 Devils 2014 4 741 3 Kings 2014 9 701 4 Royals 2014 2015 점수 순위 팀 연도 1 789 2 Riders 2015 3 673 3 Devils 2015 5 812 4 kings 2015 10 804 1 Royals 2015 2016 점수 순위 팀 연도 6 756 1 Kings 2016 8 694 2 Riders 2016 2017 Points Rank Team Year 7 788 1 Kings 2017 11 690 2 Riders 2017
默认情况下,groupby对象的标签名称与组名称相同。
使用get_group()方法,我们可以选择一个组。
# import the pandas library import pandas as pd ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') print(grouped.get_group(2014))
실행 결과는 다음과 같습니다:
Points Rank Team Year 0 876 1 Riders 2014 2 863 2 Devils 2014 4 741 3 Kings 2014 9 701 4 Royals 2014
聚合函数为每个组返回一个聚合值。一旦通过组对象被创建,几个聚合操作可以在分组的数据来执行。
一个明显的方法是通过合计或等效的agg方法进行合计。
# import the pandas library import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Year') print(grouped['Points'].agg(np.mean))
실행 결과는 다음과 같습니다:
Year 2014 795.25 2015 769.50 2016 725.00 2017 739.00 Name: Points, dtype: float64
查看每个组的大小的另一种方法是通过应用size()函数。
import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) Attribute Access in Python Pandas grouped = df.groupby('Team') print(grouped.agg(np.size))
실행 결과는 다음과 같습니다:
Points Rank Year Team Devils 2 2 2 Kings 3 3 3 Riders 4 4 4 Royals 2 2 2 kings 1 1 1
借助分组的Series,您还可以传递函数的列表或字典来进行聚合,并生成DataFrame作为输出-
# import the pandas library import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Team') print(grouped['Points'].agg([np.sum, np.mean, np.std]))
실행 결과는 다음과 같습니다:
Team sum mean std 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
在组或列上进行转换将返回一个索引,该索引的大小与正在分组的对象的大小相同。因此,转换应返回与组块大小相同的结果。
# import the pandas library import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) grouped = df.groupby('Team') score = lambda x: (x - x.mean())) / x.std()*10 print(grouped.transform(score))
실행 결과는 다음과 같습니다:
점수 순위 연도 0 12.843272 -15.000000 -11.618950 1 3.020286 5.000000 -3.872983 2 7.071068 -7.071068 -7.071068 3 -7.071068 7.071068 7.071068 4 -8.608621 11.547005 -10.910895 5 NaN NaN NaN 6 -2.360428 -5.773503 2.182179 7 10.969049 -5.773503 8.728716 8 -7.705963 5.000000 3.872983 9 -7.071068 7.071068 -7.071068 10 7.071068 -7.071068 7.071068 11 -8.157595 5.000000 11.618950
필터링 데이터를 정의된 조건에 따라 필터링하고 데이터의 부분 집합을 반환합니다. 필터() 함수는 데이터를 선택하는 데 사용됩니다.
import pandas as pd import numpy as np ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], '순위': [1 2 2 3 34 1 12 412], '연도': [201420152014201520142015201620172016201420152017], '점수': [876789863673741812756788694701804690]} df = pd.DataFrame(ipl_data) print(df.groupby('Team').filter(lambda x: len(x) >= 3))
실행 결과는 다음과 같습니다:
점수 순위 팀 연도 0 876 1 Riders 2014 1 789 2 Riders 2015 4 741 3 Kings 2014 6 756 1 Kings 2016 7 788 1 Kings 2017 8 694 2 Riders 2016 11 690 2 Riders 2017