本文目录导读:

我来详细介绍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分组的常见场景,你可以根据实际需求选择合适的方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播