本文目录导读:

我来详细介绍Pandas中数据分组和分析的常用方法。
基础分组操作
创建示例数据
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'department': ['IT', 'HR', 'IT', 'Sales', 'HR', 'Sales', 'IT', 'HR'],
'city': ['北京', '上海', '北京', '上海', '北京', '上海', '上海', '北京'],
'salary': [15000, 12000, 18000, 14000, 11000, 16000, 20000, 13000],
'age': [25, 30, 35, 28, 32, 27, 40, 29],
'performance': [85, 90, 88, 92, 78, 85, 95, 82]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
单层分组
# 按部门分组求平均薪资
dept_avg = df.groupby('department')['salary'].mean()
print("各部门平均薪资:")
print(dept_avg)
# 按城市分组统计人数和平均薪资
city_stats = df.groupby('city').agg({
'salary': ['mean', 'std', 'min', 'max'],
'age': 'mean',
'performance': 'mean'
})
print("\n各城市统计:")
print(city_stats)
多层分组(分层)
# 按部门和城市分组
grouped = df.groupby(['department', 'city'])
print("分组对象信息:")
print(grouped)
# 计算各组统计值
result = grouped['salary'].agg(['mean', 'sum', 'count'])
print("\n各部门-城市薪资统计:")
print(result)
# 多层聚合
multi_agg = grouped.agg({
'salary': ['mean', 'std'],
'age': ['mean', 'min', 'max'],
'performance': ['mean', 'max']
})
print("\n多层聚合结果:")
print(multi_agg)
层次索引操作
# 创建层次索引
hierarchical_df = df.set_index(['department', 'city'])
print("层次索引数据:")
print(hierarchical_df)
# 选择特定层级
print("\n选择所有IT部门的数据:")
print(hierarchical_df.loc['IT'])
# 选择特定组合
print("\n选择IT部门在北京的数据:")
print(hierarchical_df.loc[('IT', '北京')])
# 跨层级选择
print("\n选择所有北京的数据:")
print(hierarchical_df.xs('北京', level='city'))
实际案例:销售数据分析
# 创建更复杂的销售数据
np.random.seed(42)
sales_data = {
'date': pd.date_range('2024-01-01', periods=100, freq='D'),
'product': np.random.choice(['A', 'B', 'C', 'D'], 100),
'region': np.random.choice(['华北', '华东', '华南', '西南'], 100),
'sales_amount': np.random.randint(100, 1000, 100),
'quantity': np.random.randint(1, 50, 100),
'customer_type': np.random.choice(['个人', '企业', '政府'], 100)
}
sales_df = pd.DataFrame(sales_data)
print("销售数据前5行:")
print(sales_df.head())
1 多维度分析
# 按产品和区域分组分析
product_region = sales_df.groupby(['product', 'region']).agg({
'sales_amount': ['sum', 'mean', 'count'],
'quantity': 'sum',
'customer_type': lambda x: x.mode().iloc[0] # 最常见的客户类型
}).round(2)
print("产品-区域销售分析:")
print(product_region)
# 重置索引
product_region_reset = product_region.reset_index()
print("\n重置索引后的数据:")
print(product_region_reset.head())
2 时间序列分组
# 按月分组
sales_df['month'] = sales_df['date'].dt.month
monthly_sales = sales_df.groupby('month').agg({
'sales_amount': 'sum',
'quantity': 'sum'
})
print("月度销售汇总:")
print(monthly_sales)
# 按周分组
sales_df['week'] = sales_df['date'].dt.isocalendar().week
weekly_sales = sales_df.groupby('week').agg({
'sales_amount': 'sum',
'quantity': 'mean'
}).round(2)
print("\n周度销售统计:")
print(weekly_sales.head())
高级分组技巧
1 自定义聚合函数
def range_func(x):
"""计算范围"""
return x.max() - x.min()
def cv_func(x):
"""计算变异系数"""
return x.std() / x.mean()
# 应用自定义函数
custom_agg = sales_df.groupby('product').agg({
'sales_amount': ['mean', range_func, cv_func],
'quantity': ['sum', 'std']
}).round(2)
print("自定义聚合结果:")
print(custom_agg)
2 条件分组
# 创建销售等级
sales_df['level'] = pd.cut(sales_df['sales_amount'],
bins=[0, 300, 600, 1000],
labels=['低', '中', '高'])
# 按等级分组
level_analysis = sales_df.groupby('level', observed=False).agg({
'sales_amount': ['count', 'mean', 'sum'],
'quantity': 'mean'
}).round(2)
print("销售等级分析:")
print(level_analysis)
3 分组后变换
# 计算组内排名
sales_df['rank_in_product'] = sales_df.groupby('product')['sales_amount'].rank(ascending=False)
print("\n产品内销售排名:")
print(sales_df[['product', 'sales_amount', 'rank_in_product']].head())
# 计算组内百分比
sales_df['pct_in_region'] = sales_df.groupby('region')['sales_amount'].transform(
lambda x: x / x.sum() * 100
).round(2)
print("\n区域内销售占比:")
print(sales_df[['region', 'sales_amount', 'pct_in_region']].head())
实用技巧
1 分组后合并
# 计算组均值并合并回原数据
product_means = sales_df.groupby('product')['sales_amount'].transform('mean')
sales_df['product_avg_sales'] = product_means.round(2)
print("添加产品平均销售额:")
print(sales_df[['product', 'sales_amount', 'product_avg_sales']].head())
2 分层采样
# 按产品分层随机抽样
stratified_sample = sales_df.groupby('product', group_keys=False).apply(
lambda x: x.sample(min(len(x), 3))
)
print("分层抽样结果(每个产品最多3条):")
print(stratified_sample.head())
性能优化建议
# 1. 使用分类数据类型优化
sales_df['product'] = sales_df['product'].astype('category')
sales_df['region'] = sales_df['region'].astype('category')
# 2. 使用groupby的sort参数
fast_group = sales_df.groupby(['product', 'region'], sort=False).size()
# 3. 避免使用apply,优先使用内置函数
# 推荐(快)
result_fast = sales_df.groupby('product')['sales_amount'].sum()
# 不推荐(慢)
result_slow = sales_df.groupby('product')['sales_amount'].apply(np.sum)
print("性能优化后的分组结果:")
print(result_fast)
这些案例涵盖了Pandas分组的常见场景,你可以根据实际需求选择合适的方法。