本文目录导读:

我来详细介绍如何使用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()等向量化操作 - 灵活应用:支持自定义函数和复杂分析逻辑
这些方法可以帮助你高效地处理和分析分组数据,适用于各种实际业务场景。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播