You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas手动多维度分组求和代码改写为循环实现?

问题:多维度分组求和的循环实现

原始数据集

action  | indicator | channel | greenfield | trucking | studio
-------------------------------------------------------------
approved| cash      | DM      | .0067      | .2356    | .1451
approved| cash      | DM      | .1067      | .4549    | .4881
approved| card      | EM      | .2067      | .8424    | .0264
approved| card      | EM      | .3067      | .5949    | .1564
approved| online    | RM      | .4555      | .4987    | .5616
...

当前手动实现方式

目前通过手动筛选条件求和:

data.loc[(data['action'] == "approved") & (data['indicator'] == "cash") & 
    (data['channel'] == "DM"), 'greenfield'].sum()

需求

希望将手动操作改为循环逻辑,遍历相关列,按channel、indicator、action三个维度分组求和,最终生成如下格式的新数据表:

Segment | Name   | greenfield | trucking | studio
------------------------------------------------
DM      |Approved| .1134      | .6905    | .6332
EM      |Approved|.....       |.....     |.....

解决方案

方法1:循环实现分组求和

如果你一定要用循环来实现,可以按以下步骤操作:

  • 先获取三个分组维度的所有唯一组合:
# 获取三个维度的唯一值组合
groups = data[['channel', 'indicator', 'action']].drop_duplicates().values.tolist()
  • 初始化一个空的DataFrame来存储结果:
import pandas as pd

result_cols = ['Segment', 'Name', 'greenfield', 'trucking', 'studio']
result_df = pd.DataFrame(columns=result_cols)
  • 遍历每个分组组合,计算对应列的求和值,然后添加到结果表中:
# 遍历每个分组组合
for channel, indicator, action in groups:
    # 筛选当前分组的数据
    mask = (data['channel'] == channel) & (data['indicator'] == indicator) & (data['action'] == action)
    group_data = data[mask]
    
    # 计算各数值列的求和
    greenfield_sum = group_data['greenfield'].sum()
    trucking_sum = group_data['trucking'].sum()
    studio_sum = group_data['studio'].sum()
    
    # 将结果添加到结果表,注意Name列首字母大写
    result_df.loc[len(result_df)] = [
        channel,
        action.capitalize(),
        round(greenfield_sum, 4),  # 保留4位小数和示例格式一致
        round(trucking_sum, 4),
        round(studio_sum, 4)
    ]

方法2:Pandas原生GroupBy(更高效推荐)

其实Pandas自带的groupby方法可以更简洁高效地实现需求,无需手动写循环:

  • 按指定维度分组,对数值列求和:
# 按指定维度分组,对数值列求和
grouped = data.groupby(['channel', 'indicator', 'action'])[['greenfield', 'trucking', 'studio']].sum().reset_index()
  • 重命名列名并调整格式:
# 重命名列名以匹配目标格式
grouped.rename(columns={
    'channel': 'Segment',
    'action': 'Name'
}, inplace=True)

# 将Name列首字母大写
grouped['Name'] = grouped['Name'].str.capitalize()

# 调整列顺序
grouped = grouped[['Segment', 'Name', 'greenfield', 'trucking', 'studio']]

# 保留4位小数
grouped = grouped.round(4)

运行后得到的grouped就是你想要的结果表,比循环更简洁且性能更好,尤其是数据量较大时。


内容的提问来源于stack exchange,提问作者Nanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:27:15