如何将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
相关产品推荐
相关产品推荐

