看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的 DataFrame、Series 和 Index 均支持 groupby() 对数据按一定的规则进行分组,用于类型于 SQL 中的 group by 语句或者 Excel 中的分组透视操作。pandas 的 groupby() 支持更加强大、强加灵活的数据分组,将原数据创建为一个分组对象,并利用聚合统计函数或者自定义函数对分组进行聚合计算。
分组方法 groupby() 在 DataFrame 和 Series 的语法大致相同,以 DataFrame 为例,如下:
DataFrame.groupby(by=None,
axis=0,
level=None,
as_index=True,
sort=True,
group_keys=True,
squeeze=NoDefault.no_default, # 将废弃
observed=False,
dropna=True)
主要功能为使用映射器或一个或者多个列对数据进行分组。
完整的 groupby 操作包括拆分对象、应用函数和合并结果的组合。它可以用于对大量数据进行分组,并在这些组上进行操作。
以下将介绍各位参数:
注意:
由于从 pandas 2.1( 2023年08月30日更新)开始,将不建议参数 axis=1 在 DataFrame.groupby()
中使用,推荐 frame.T.groupby(...)
方法,即先将 DataFrame 转置,再分组。
针对 by 参数,我们总结不同的方法如下:
df.groupby('A')
是只 df.groupby(df['A'])
的语法糖返回包含组信息的分组对象(groupby object),各个组会增加一个 name 属性,来表示组名。
关于分组对象可以使用以下操作:
有关更详细的用法和示例,请参阅:
包括将对象拆分为组、遍历组、选择组、聚合等。
简单的分组功能:
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.]})
df
'''
Animal Max Speed
0 Falcon 380.0
1 Falcon 370.0
2 Parrot 24.0
3 Parrot 26.0
'''
df.groupby(['Animal']).mean()
'''
Max Speed
Animal
Falcon 375.0
Parrot 25.0
'''
多层索引上的应用。我们可以使用级别参数按层次索引的不同级别进行分组:
arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
['Captive', 'Wild', 'Captive', 'Wild']]
index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
df = pd.DataFrame({'Max Speed': [390., 350., 30., 20.]},
index=index)
df
'''
Max Speed
Animal Type
Falcon Captive 390.0
Wild 350.0
Parrot Captive 30.0
Wild 20.0
'''
df.groupby(level=0).mean()
'''
Max Speed
Animal
Falcon 370.0
Parrot 25.0
'''
df.groupby(level="Type").mean()
'''
Max Speed
Type
Captive 210.0
Wild 185.0
'''
我们也可以通过设置dropna参数来选择是否在组键中包含 NA,默认设置为 True。
l = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]
df = pd.DataFrame(l, columns=["a", "b", "c"])
df.groupby(by=["b"]).sum()
'''
a c
b
1.0 2 3
2.0 2 5
'''
df.groupby(by=["b"], dropna=False).sum()
'''
a c
b
1.0 2 3
2.0 2 5
NaN 1 4
'''
l = [["a", 12, 12], [None, 12.3, 33.], ["b", 12.3, 123], ["a", 1, 1]]
df = pd.DataFrame(l, columns=["a", "b", "c"])
df.groupby(by="a").sum()
'''
b c
a
a 13.0 13.0
b 12.3 123.0
'''
df.groupby(by="a", dropna=False).sum()
'''
b c
a
a 13.0 13.0
b 12.3 123.0
NaN 12.3 33.0
'''
在 Series 上简单的使用:
ser = pd.Series([390., 350., 30., 20.],
index=['Falcon', 'Falcon', 'Parrot', 'Parrot'], name="Max Speed")
ser
'''
Falcon 390.0
Falcon 350.0
Parrot 30.0
Parrot 20.0
Name: Max Speed, dtype: float64
'''
ser.groupby(["a", "b", "a", "b"]).mean()
'''
a 210.0
b 185.0
Name: Max Speed, dtype: float64
'''
ser.groupby(level=0).mean()
'''
Falcon 370.0
Parrot 25.0
Name: Max Speed, dtype: float64
'''
ser.groupby(ser > 100).mean()
'''
Max Speed
False 25.0
True 370.0
Name: Max Speed, dtype: float64
'''
按索引分组。我们可以使用级别参数按层次索引的不同级别进行分组:
arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
['Captive', 'Wild', 'Captive', 'Wild']]
index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
ser = pd.Series([390., 350., 30., 20.], index=index, name="Max Speed")
ser
'''
Animal Type
Falcon Captive 390.0
Wild 350.0
Parrot Captive 30.0
Wild 20.0
Name: Max Speed, dtype: float64
'''
ser.groupby(level=0).mean()
'''
Animal
Falcon 370.0
Parrot 25.0
Name: Max Speed, dtype: float64
'''
ser.groupby(level="Type").mean()
'''
Type
Captive 210.0
Wild 185.0
Name: Max Speed, dtype: float64
'''
我们也可以通过定义 dropna 参数来选择是否在组键中包含 NA,默认设置为 True。
ser = pd.Series([1, 2, 3, 3], index=["a", 'a', 'b', np.nan])
ser.groupby(level=0).sum()
'''
a 3
b 3
dtype: int64
'''
ser.groupby(level=0, dropna=False).sum()
'''
a 3
b 3
NaN 3
dtype: int64
'''
arrays = ['Falcon', 'Falcon', 'Parrot', 'Parrot']
ser = pd.Series([390., 350., 30., 20.], index=arrays, name="Max Speed")
ser.groupby(["a", "b", "a", np.nan]).mean()
'''
a 210.0
b 350.0
Name: Max Speed, dtype: float64
'''
ser.groupby(["a", "b", "a", np.nan], dropna=False).mean()
'''
a 210.0
b 350.0
NaN 20.0
Name: Max Speed, dtype: float64
'''
在 pandas 的 Index 对象上,可以使用 groupby(参数为一个类似数组的类型)按给定的值数组对索引标签进行分组。
如以下将一个 0 到 5 的 RangeIndex 类型的索引对象使用 groupby() 分为 a、b、c 三组:
idx = pd.Index(range(6))
index
# RangeIndex(start=0, stop=6, step=1)
idx.groupby([*'aabcc'])
# {'a': [0, 1], 'b': [2], 'c': [3, 4]}
它返回的一个字典以键为组名,值成员为索引标签名列表。
更新时间:2023-09-01 12:37:28 标签:pandas python groupby 分组