本文目录导读:

我来详细介绍使用Pandas进行数据聚合的各种方法和实际案例。
基础聚合函数
准备示例数据
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'部门': ['销售部', '销售部', '技术部', '技术部', '市场部', '市场部', '销售部', '技术部'],
'区域': ['华北', '华东', '华北', '华东', '华北', '华东', '华北', '华东'],
'员工': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'],
'销售额': [10000, 15000, 20000, 18000, 12000, 16000, 11000, 22000],
'成本': [6000, 8000, 12000, 10000, 7000, 9000, 6500, 13000],
'数量': [10, 15, 20, 18, 12, 16, 11, 22]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
使用 groupby() 进行分组聚合
单列分组聚合
# 按部门分组,计算销售额总和
dept_sum = df.groupby('部门')['销售额'].sum()
print("各部门销售额总和:")
print(dept_sum)
# 按部门分组,计算销售额平均值
dept_mean = df.groupby('部门')['销售额'].mean()
print("\n各部门销售额平均值:")
print(dept_mean)
# 多个聚合函数同时使用
dept_stats = df.groupby('部门')['销售额'].agg(['sum', 'mean', 'std', 'min', 'max'])
print("\n各部门销售额统计:")
print(dept_stats)
多列分组聚合
# 按部门和区域分组
grouped = df.groupby(['部门', '区域'])
# 计算各分组销售额总和
sales_by_group = grouped['销售额'].sum()
print("各部门和区域的销售额总和:")
print(sales_by_group)
# 多个列的聚合
multi_agg = grouped[['销售额', '成本', '数量']].sum()
print("\n各部门和区域的汇总:")
print(multi_agg)
使用 agg() 自定义聚合
多个聚合函数
# 对不同列应用不同聚合函数
result = df.groupby('部门').agg({
'销售额': ['sum', 'mean', 'count'],
'成本': ['sum', 'mean'],
'数量': ['sum', 'mean', 'max']
})
print("自定义聚合结果:")
print(result)
# 简化列名
result2 = df.groupby('部门').agg(
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean'),
总成本=('成本', 'sum'),
总数量=('数量', 'sum')
)
print("\n带列名的聚合结果:")
print(result2)
自定义聚合函数
# 自定义聚合函数
def profit_margin(series):
"""计算利润率"""
return series.mean() * 0.1
def range_func(series):
"""计算范围"""
return series.max() - series.min()
# 应用自定义函数
result = df.groupby('部门').agg({
'销售额': ['sum', 'mean', range_func],
'利润': ('销售额', lambda x: x.sum() - df.loc[x.index, '成本'].sum())
})
print("自定义函数聚合结果:")
print(result)
实际业务案例
案例1:销售分析报表
# 创建更多真实数据
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=100, freq='D'),
'产品': np.random.choice(['A产品', 'B产品', 'C产品'], 100),
'区域': np.random.choice(['华北', '华东', '华南', '西南'], 100),
'销售额': np.random.randint(1000, 50000, 100),
'数量': np.random.randint(1, 100, 100)
})
# 月度销售统计
sales_data['月份'] = sales_data['日期'].dt.month
monthly_report = sales_data.groupby('月份').agg(
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean'),
总数量=('数量', 'sum'),
订单数=('数量', 'count'),
最高单笔=('销售额', 'max')
).round(2)
print("月度销售报表:")
print(monthly_report)
# 产品区域交叉分析
product_region = sales_data.groupby(['产品', '区域']).agg(
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean'),
订单数量=('数量', 'count')
).round(2)
print("\n产品-区域交叉分析:")
print(product_region)
案例2:用户行为分析
# 模拟用户行为数据
user_data = pd.DataFrame({
'用户ID': np.random.randint(1, 50, 200),
'访问时间': pd.date_range('2024-01-01', periods=200, freq='H'),
'页面': np.random.choice(['首页', '产品页', '购物车', '结算页'], 200),
'停留时长': np.random.randint(10, 600, 200),
'是否购买': np.random.choice([0, 1], 200, p=[0.7, 0.3])
})
# 用户行为聚合分析
user_analysis = user_data.groupby('用户ID').agg(
访问次数=('访问时间', 'count'),
平均停留时长=('停留时长', 'mean'),
购买次数=('是否购买', 'sum'),
购买转化率=('是否购买', 'mean')
).round(2)
print("用户行为分析:")
print(user_analysis.head())
# 页面流量分析
page_analysis = user_data.groupby('页面').agg(
访问量=('访问时间', 'count'),
平均停留时长=('停留时长', 'mean'),
购买转化率=('是否购买', 'mean')
).round(2)
print("\n页面流量分析:")
print(page_analysis)
高级聚合技巧
聚合后重置索引
# 默认groupby结果以分组列为索引
result = df.groupby('部门')['销售额'].sum()
print("默认索引:")
print(result)
# 重置索引
result_reset = result.reset_index()
print("\n重置索引后:")
print(result_reset)
# 使用as_index=False参数
result2 = df.groupby('部门', as_index=False)['销售额'].sum()
print("\nas_index=False:")
print(result2)
多重聚合与数据透视
# 使用pivot_table实现类似Excel数据透视表
pivot = pd.pivot_table(
df,
values=['销售额', '成本'],
index='部门',
columns='区域',
aggfunc={
'销售额': ['sum', 'mean'],
'成本': 'sum'
},
fill_value=0
)
print("数据透视表:")
print(pivot)
# 使用crosstab
cross_tab = pd.crosstab(
df['部门'],
df['区域'],
values=df['销售额'],
aggfunc='sum'
)
print("\n交叉表:")
print(cross_tab)
条件聚合
# 基于条件的聚合
high_sales = df[df['销售额'] > 15000].groupby('部门')['销售额'].agg(['count', 'sum'])
print("高销售额记录统计:")
print(high_sales)
# 使用transform实现保持行数的聚合
df['部门平均销售额'] = df.groupby('部门')['销售额'].transform('mean')
df['销售额排名'] = df.groupby('部门')['销售额'].rank(ascending=False)
print("\n含变换结果的数据:")
print(df)
性能优化建议
# 大数据集时使用优化方法
# 1. 选择必要列
optimized = df[['部门', '销售额']].groupby('部门').sum()
# 2. 使用categorical数据类型
df['部门'] = df['部门'].astype('category')
# 3. 批量操作
result = df.groupby('部门').agg(
total_sales=('销售额', 'sum'),
avg_sales=('销售额', 'mean'),
std_sales=('销售额', 'std')
)
这些案例涵盖了Pandas数据聚合的主要场景,从基础用法到高级技巧,根据实际需求选择合适的聚合方法可以提高数据分析效率。