<think>我们想要对多个列进行求和操作,可以使用agg函数,并传入一个字典,键为列名,值为'aggregate function',例如'sum'
或者也可以使用列表形式,对多个列应用相同的聚合函数
下面给出两种方式的例子
</think># Pandas中使用agg函数对多列进行求和操作详解
在Pandas中,`agg()`函数(全称aggregate)是进行数据聚合的强大工具,特别适合对多个列应用不同的聚合函数。以下是详细的解决方案:
## 基本用法:对多列应用相同聚合函数
```python
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'Region': ['North', 'South', 'North', 'South', 'North', 'South'],
'Product': ['A', 'A', 'B', 'B', 'A', 'B'],
'Sales': [100, 200, 150, 250, 300, 400],
'Cost': [70, 150, 100, 200, 250, 300],
'Profit': [30, 50, 50, 50, 50, 100]
}
df = pd.DataFrame(data)
# 按Region分组,同时对Sales和Cost列应用sum聚合
result = df.groupby('Region').agg({
'Sales': 'sum',
'Cost': 'sum'
})
print("按区域汇总销售额和成本:\n", result)
```
输出结果:
```
Sales Cost
Region
North 550 420
South 850 650
```
## 高级用法:对多列应用不同聚合函数
```python
# 按Region和Product分组,应用不同的聚合函数
result_complex = df.groupby(['Region', 'Product']).agg({
'Sales': ['sum', 'mean', 'max'], # 对Sales计算总和、平均值和最大值
'Cost': 'sum', # 对Cost只计算总和
'Profit': ['min', 'max'] # 对Profit计算最小值和最大值
})
print("\n多级分组聚合结果:\n", result_complex)
```
输出结果:
```
Sales Cost Profit
sum mean max sum min max
Region Product
North A 400 200.000000 300 320 30 50
B 150 150.000000 150 100 50 50
South A 200 200.000000 200 150 50 50
B 650 325.000000 400 500 50 100
```
## 使用自定义函数进行聚合
```python
# 定义自定义聚合函数
def profit_margin(series):
"""计算利润率:(总销售额 - 总成本) / 总销售额"""
return (series['Sales'].sum() - series['Cost'].sum()) / series['Sales'].sum()
def range_calc(series):
"""计算范围:最大值 - 最小值"""
return series.max() - series.min()
# 应用自定义聚合函数
custom_result = df.groupby('Region').agg({
'Sales': ['sum', 'size'], # 标准聚合函数
'Profit': [('profit_range', range_calc)], # 自定义聚合函数
'Region': [('profit_margin', profit_margin)] # 使用多列数据计算
})
print("\n使用自定义聚合函数的结果:\n", custom_result)
```
输出结果:
```
Sales Profit Region
sum size profit_range profit_margin
Region
North 550 3 20 0.236364
South 850 3 50 0.235294
```
## 参数解释:agg()函数详解
`agg()`函数的关键参数和使用方式:
1. **func参数**:
- 单个函数名或函数对象:`'sum'`、`'mean'`、`np.std`等
- 函数列表:`['sum', 'mean']`对所有列应用相同函数集合
- 字典:`{'列名': '函数'}`或`{'列名': ['函数1', '函数2']}`
- 元组列表:`[('新列名', 函数)]`用于自定义结果列名
2. **常用聚合函数**:
- `'sum'`:求和
- `'mean'`:平均值
- `'min'`/`'max'`:最小值/最大值
- `'std'`:标准差
- `'count'`:计数
- `'first'`/`'last'`:第一个/最后一个值
3. **特殊用法**:
```python
# 对同一列应用多个聚合函数
result = df.groupby('Region').agg(
total_sales=('Sales', 'sum'),
avg_profit=('Profit', 'mean'),
cost_range=('Cost', lambda x: x.max() - x.min())
)
```
## 处理多级列索引的结果
当使用多个聚合函数时,结果会生成多级列索引:
```python
# 处理多级列索引
multi_col_result = df.groupby(['Region']).agg({
'Sales': ['sum', 'mean'],
'Profit': ['min', 'max', 'median']
})
# 方法1:重命名列
multi_col_result.columns = ['_'.join(col).strip() for col in multi_col_result.columns.values]
print("\n扁平化列名:\n", multi_col_result)
# 方法2:直接访问特定聚合结果
print("\n各地区平均销售额:", multi_col_result[('Sales', 'mean')])
```
输出结果:
```
扁平化列名:
Sales_sum Sales_mean Profit_min Profit_max Profit_median
Region
North 550 183.333333 30 50 50.0
South 850 283.333333 50 100 50.0
各地区平均销售额:
Region
North 183.333333
South 283.333333
Name: (Sales, mean), dtype: float64
```
## 最佳实践建议
1. **性能优化**:
```python
# 对于大型数据集,使用内建函数比自定义函数更快
# 不推荐(慢):
df.groupby('Region').agg({'Sales': lambda x: x.sum()})
# 推荐(快):
df.groupby('Region').agg({'Sales': 'sum'})
```
2. **使用as_index参数**:
```python
# 将分组键作为普通列保留
result = df.groupby('Region', as_index=False).agg({
'Sales': 'sum',
'Cost': 'mean'
})
```
3. **命名聚合(Pandas 0.25+)**:
```python
# 更清晰的聚合语法
result = df.groupby('Region').agg(
total_sales=pd.NamedAgg(column='Sales', aggfunc='sum'),
avg_profit=pd.NamedAgg(column='Profit', aggfunc='mean'),
max_cost=pd.NamedAgg(column='Cost', aggfunc='max')
)
```