本文目录导读:

我来详细介绍如何使用Pandas进行数据分组迭代,包含多个实用案例。
基本分组迭代
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['技术部', '技术部', '市场部', '市场部', '财务部', '财务部'],
'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'薪资': [15000, 18000, 12000, 16000, 20000, 22000],
'年龄': [28, 32, 25, 30, 35, 38]
})
print("原始数据:")
print(df)
# 基本分组迭代
print("\n=== 按部门分组迭代 ===")
for name, group in df.groupby('部门'):
print(f"\n部门: {name}")
print(group)
多列分组迭代
# 创建多层级分组数据
df_multi = pd.DataFrame({
'城市': ['北京', '北京', '上海', '上海', '广州', '广州'],
'产品': ['A', 'B', 'A', 'B', 'A', 'B'],
'销量': [100, 150, 200, 180, 120, 160],
'金额': [10000, 15000, 20000, 18000, 12000, 16000]
})
print("多列分组数据:")
print(df_multi)
# 多列分组迭代
print("\n=== 按城市和产品分组迭代 ===")
for (city, product), group in df_multi.groupby(['城市', '产品']):
print(f"\n城市: {city}, 产品: {product}")
print(group)
分组后聚合计算
# 创建包含多个数值列的数据
df_sales = pd.DataFrame({
'区域': ['华北', '华北', '华东', '华东', '华南', '华南'],
'月份': ['1月', '2月', '1月', '2月', '1月', '2月'],
'销售额': [50000, 60000, 70000, 65000, 55000, 72000],
'成本': [30000, 35000, 40000, 38000, 32000, 42000],
'利润': [20000, 25000, 30000, 27000, 23000, 30000]
})
print("销售数据:")
print(df_sales)
# 分组后进行统计计算
print("\n=== 按区域分组进行统计 ===")
for name, group in df_sales.groupby('区域'):
print(f"\n区域: {name}")
print(f"平均销售额: {group['销售额'].mean():.2f}")
print(f"总销售额: {group['销售额'].sum():.2f}")
print(f"平均利润率: {(group['利润'].sum() / group['销售额'].sum() * 100):.2f}%")
分组后处理并生成新数据
# 处理每个分组并收集结果
results = []
for name, group in df.groupby('部门'):
# 对每个分组进行计算
avg_salary = group['薪资'].mean()
max_salary = group['薪资'].max()
min_salary = group['薪资'].min()
person_count = len(group)
# 构建结果
result = {
'部门': name,
'平均薪资': avg_salary,
'最高薪资': max_salary,
'最低薪资': min_salary,
'人数': person_count,
'薪资差距': max_salary - min_salary
}
results.append(result)
# 将结果转换为DataFrame
result_df = pd.DataFrame(results)
print("\n=== 部门统计分析结果 ===")
print(result_df)
条件筛选与分组迭代
# 创建包含更多列的数据
df_staff = pd.DataFrame({
'部门': ['技术部', '技术部', '市场部', '市场部', '财务部'],
'员工': ['张三', '李四', '王五', '赵六', '钱七'],
'级别': ['高级', '中级', '中级', '高级', '高级'],
'绩效': ['A', 'B', 'A', 'C', 'B'],
'薪资': [20000, 15000, 12000, 16000, 18000]
})
print("员工数据:")
print(df_staff)
# 按条件分组迭代
print("\n=== 按部门和级别分组 ===")
for (dept, level), group in df_staff.groupby(['部门', '级别']):
print(f"\n部门: {dept}, 级别: {level}")
print(f"人数: {len(group)}")
print(group[['员工', '绩效', '薪资']])
时间序列分组迭代
# 创建时间序列数据
dates = pd.date_range('2023-01-01', periods=365, freq='D')
df_time = pd.DataFrame({
'日期': dates,
'销售额': np.random.randint(1000, 5000, size=365),
'订单量': np.random.randint(50, 200, size=365)
})
# 按月分组迭代
df_time['月份'] = df_time['日期'].dt.month
df_time['年'] = df_time['日期'].dt.year
print("\n=== 按月分组统计 ===")
for (year, month), group in df_time.groupby(['年', '月份']):
print(f"\n{year}年{month}月:")
print(f"总销售额: {group['销售额'].sum():,}")
print(f"平均日销售额: {group['销售额'].mean():.2f}")
print(f"总订单量: {group['订单量'].sum()}")
实战案例:销售数据多维分析
# 创建综合销售数据
np.random.seed(42)
df_sales_complex = pd.DataFrame({
'年份': np.repeat([2023, 2024], 12),
'月份': list(range(1, 13)) * 2,
'产品': np.random.choice(['A', 'B', 'C'], size=24),
'区域': np.random.choice(['华北', '华东', '华南'], size=24),
'销售额': np.random.randint(10000, 50000, size=24),
'成本': np.random.randint(5000, 30000, size=24)
})
df_sales_complex['利润'] = df_sales_complex['销售额'] - df_sales_complex['成本']
print("复杂销售数据:")
print(df_sales_complex.head())
# 多维分组分析
print("\n=== 多维度分组分析 ===")
analysis_results = {}
for (year, region), group in df_sales_complex.groupby(['年份', '区域']):
# 计算各维度指标
total_sales = group['销售额'].sum()
total_cost = group['成本'].sum()
total_profit = group['利润'].sum()
profit_rate = (total_profit / total_sales) * 100
avg_profit = group['利润'].mean()
# 存储结果
key = f"{year}-{region}"
analysis_results[key] = {
'年份': year,
'区域': region,
'总销售额': total_sales,
'总成本': total_cost,
'总利润': total_profit,
'利润率%': profit_rate,
'平均利润': avg_profit,
'记录数': len(group)
}
# 转换为DataFrame
analysis_df = pd.DataFrame(analysis_results).T
print("\n分析结果:")
print(analysis_df)
# 按利润率排序
print("\n=== 按利润率排序 ===")
print(analysis_df.sort_values('利润率%', ascending=False))
分组迭代优化技巧
# 1. 使用agg()进行聚合
print("\n=== 使用agg()一次完成多列统计 ===")
result_agg = df.groupby('部门').agg({
'薪资': ['mean', 'max', 'min', 'std'],
'年龄': ['mean', 'min', 'max']
})
print(result_agg)
# 2. 使用transform()保持原始尺寸
print("\n=== 使用transform()添加分组统计列 ===")
df['部门平均薪资'] = df.groupby('部门')['薪资'].transform('mean')
df['薪资偏差'] = df['薪资'] - df['部门平均薪资']
print(df[['部门', '姓名', '薪资', '部门平均薪资', '薪资偏差']])
# 3. 创建自定义聚合函数
def custom_stats(series):
"""自定义统计函数"""
return pd.Series({
'均值': series.mean(),
'中位数': series.median(),
'标准差': series.std(),
'变异系数': series.std() / series.mean() * 100 if series.mean() != 0 else 0
})
print("\n=== 使用自定义函数 ===")
stats_df = df.groupby('部门')['薪资'].apply(custom_stats).unstack()
print(stats_df)
- 基本迭代:使用
groupby()和for循环逐组处理 - 多列分组:支持基于多列的组合分组
- 条件处理:可以在分组内进行筛选和条件判断
- 结果收集:处理每个分组后汇总结果
- 性能优化:对于大数据集,优先使用
agg()、transform()等向量化操作 - 灵活应用:支持自定义函数和复杂分析逻辑
这些方法可以帮助你高效地处理和分析分组数据,适用于各种实际业务场景。