文章目录
一、什么是分组?
类似SQL:
select city,max(temperature) from city_weather group by city;
groupby:先对数据分组,然后在每个分组上应用聚合函数、转换函数(例如sum、mean等函数)
二、分组并使用聚合函数做数据统计
1.创建数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
2.单个列groupby,查询所有数据列的统计
将A分组,求和
df.groupby('A').sum()
- groupby中的’A’变成了数据的索引列
- 因为要统计sum,但B列不是数字,所以被自动忽略掉
3.多个列groupby,查询所有数据列的统计
将AB列分组,求平均数
df.groupby(['A','B']).mean()
我们看到:(‘A’,‘B’)成对变成了二级索引,加入 as_index=False参数取消AB索引
df.groupby(['A','B'], as_index=False).mean()
4.同时查看多种数据统计
对A分组,然后分别求和,平均数和标准差
df.groupby('A').agg([np.sum, np.mean, np.std])
我们看到有C和D两组数据的三个数据统计,倘若我们只查看C或者D的数据
# 方法1:预过滤,性能更好
df.groupby('A')['C'].agg([np.sum, np.mean, np.std])
# 方法2
df.groupby('A').agg([np.sum, np.mean, np.std])['C']
5.不同列使用不同的聚合函数
对A分组,求C的和,D的平均值
df.groupby('A').agg({
"C":np.sum, "D":np.mean})
三、分组后的遍历
for循环可以直接遍历每个group
1.创建数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
2.遍历单个列聚合的分组
①对A分组,进行遍历
g = df.groupby('A') # g= <pandas.core.groupby.DataFrameGroupBy object at 0x000002C6166B6358>
for name, group in g:
print(name)
print(group)
print()
我们可以看到大概流程,先分组,分组了一项后,就会对该项进行统计。
②获取单个分组的数据
g.get_group('bar')
3.遍历多个列聚合的分组
①对AB分组,进行遍历
g = df.groupby(['A', 'B'])
for name,group in g:
print(name)
print(group)
print()
可以看到,name是一个2个元素的tuple,代表不同的列
②获取单个分组的数据
g.get_group(('foo', 'one'))
③可以直接查询group后的某几列,生成Series或者子DataFrame
g = df.groupby(['A', 'B'])
# print(g['C']) #g['C']=<pandas.core.groupby.SeriesGroupBy object at 0x00000148CF177EF0>
for name, group in g['C']:
print(name)
print(group)
print(type(group))
print()