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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40558166/article/details/107662249
今日推荐