Pandas 分组聚合详解
简介
在数据处理中,很常见的一种需求是把数据按照某些标准进行分组,然后在每个组内进行聚合操作。比如求每个人的年龄平均值,在每个城市中计算房价的均值等等。这个时候Pandas的分组聚合就可以帮我们轻松实现。
分组操作
Pandas中的分组操作主要是通过groupby()函数来实现的。下面我们用一个示例数据集进行分析:
import pandas as pd
import numpy as np
data = pd.DataFrame({'group':['a', 'a', 'b', 'b', 'c', 'c'],
'value':[1, 2, 3, 4, 5, 6]})
print(data)
输出结果如下:
group value
0 a 1
1 a 2
2 b 3
3 b 4
4 c 5
5 c 6
现在我们想按照group
这一列进行分组,然后再对每个组内的value
求和:
grouped = data.groupby('group')
result = grouped['value'].sum()
print(result)
输出结果如下:
group
a 3
b 7
c 11
Name: value, dtype: int64
可以看到,我们按照group
这一列分成了三组,然后对每组分别求和,得到了一个新的Series对象。
聚合函数
对于每个分组,我们可以对其应用多个聚合函数。Pandas内置了很多聚合函数,可以满足大多数需求。如下是一个列表:
函数 | 描述 |
---|---|
count | 非NA值的数量 |
sum | 求和 |
mean | 均值 |
median | 中位数 |
min | 最小值 |
max | 最大值 |
prod | 乘积 |
std | 标准差 |
var | 方差 |
这些函数都可以作为groupby()函数的参数,应用于每个分组。例如,我们想同时求出每个组的均值和标准差:
grouped = data.groupby('group')
result = grouped['value'].agg([np.mean, np.std])
print(result)
输出结果如下:
mean std
group
a 1.500000 0.707107
b 3.500000 0.707107
c 5.500000 0.707107
可以看到,我们传入了一个包含聚合函数的列表,输出结果是一个新的DataFrame对象,包括了每个组的均值和标准差。
多级分组
除了单一的分组列外,我们也可以根据多列进行分组,从而得到多级分组结果。如下是一个示例:
data = pd.DataFrame({'group1':['a', 'a', 'b', 'b', 'c', 'c'],
'group2':['x', 'y', 'x', 'y', 'x', 'y'],
'value1':[1, 2, 3, 4, 5, 6],
'value2':[2, 4, 6, 8, 10, 12]})
grouped = data.groupby(['group1', 'group2'])
result = grouped.mean()
print(result)
输出结果如下:
value1 value2
group1 group2
a x 1.0 2.0
y 2.0 4.0
b x 3.0 6.0
y 4.0 8.0
c x 5.0 10.0
y 6.0 12.0
可以看到,我们按照group1
和group2
这两列进行了分组,得到了多级分组结果。
示例1:按地区分组,统计每个地区每年的销售总额
假设我们有一份数据记录了每个人在不同地区的销售金额和年份,数据如下:
名称 | 地区 | 年份 | 销售额 |
---|---|---|---|
张三 | 北京 | 2019 | 10 |
李四 | 上海 | 2018 | 13 |
王五 | 北京 | 2019 | 22 |
马六 | 上海 | 2019 | 18 |
赵七 | 北京 | 2018 | 8 |
钱八 | 上海 | 2018 | 15 |
我们现在想要对数据进行分组,以地区为标准,统计每个地区每年的销售总额。可以按如下代码进行操作:
data = pd.DataFrame({'name':['张三', '李四', '王五', '马六', '赵七', '钱八'],
'region':['北京', '上海', '北京', '上海', '北京', '上海'],
'year':[2019, 2018, 2019, 2019, 2018, 2018],
'sales':[10, 13, 22, 18, 8, 15]})
grouped = data.groupby(['region', 'year'])
result = grouped['sales'].sum()
print(result)
输出结果为:
region year
北京 2018 8
2019 32
上海 2018 28
2019 18
Name: sales, dtype: int64
可以发现,通过groupby()函数,我们按照地区和年份两个列进行了多级分组,然后对每个组的sales
列进行了求和操作。
示例2:按月份分组,分别统计每天的最高温度和最低温度
假设我们有一份记录了某城市每天的最高温度和最低温度的数据,数据如下:
日期 | 最高温度 | 最低温度 |
---|---|---|
2021-01-01 | 5 | -3 |
2021-01-02 | 4 | -1 |
2021-01-03 | 3 | -2 |
2021-02-01 | 12 | 6 |
2021-02-02 | 10 | 5 |
2021-02-03 | 11 | 4 |
我们现在想要按月份分组,分别统计每天的最高温度和最低温度。可以按如下代码进行操作:
data = pd.DataFrame({'date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-02-01', '2021-02-02', '2021-02-03'],
'high_temperature':[5, 4, 3, 12, 10, 11],
'low_temperature':[-3, -1, -2, 6, 5, 4]})
data['month'] = pd.to_datetime(data['date']).dt.month # 添加月份列
grouped = data.groupby('month')
result = grouped.agg({'high_temperature': max, 'low_temperature': min})
print(result)
输出结果为:
high_temperature low_temperature
month
1 5 -3
2 12 4
可以发现,通过添加month
列并按照该列进行分组操作,我们得到了每个月的最高温度和最低温度的聚合结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pandas分组聚合详解 - Python技术站