Pandas(七):分组聚合groupby

一、什么是分组?

类似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()

在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张烫麻辣亮。

谢谢老板支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值