Pandas:按指定标识合并Fee行至匹配行并求和
数据处理方案:合并Fee行至匹配的非Fee行
需求说明
处理约20000行表格数据,执行以下操作:
- 筛选所有
Type='Fee'的行 - 将这些Fee行的
Total数值,累加至Week、Store、ID完全匹配且Type≠'Fee'的唯一行中,保留目标行的Type字段不变 - 最终移除所有Fee行
示例规则验证
- 输入中第3、8行(Type=Fee)的Total(13+885)累加至第1行,最终Total=200+13+885=1098
- 第5行(Type=Fee)的Total(98)累加至第2行,最终Total=189+98=287
- 第6行(Type=Fee)的Total(435)累加至第9行,最终Total=146+435=581
- 无匹配Fee行的行,Total保持原值
输入表格
| Week | Store | Type | ID | Total |
|---|---|---|---|---|
| 15 | US1 | RE-G | T3400 | 200 |
| 15 | US4 | TO | T656 | 189 |
| 15 | US1 | Fee | T3400 | 13 |
| 16 | US4 | RD | T173 | 15 |
| 15 | US4 | Fee | T656 | 98 |
| 16 | US4 | Fee | T1121 | 435 |
| 17 | US4 | TO | T656 | 189 |
| 15 | US1 | Fee | T3400 | 885 |
| 16 | US4 | MX | T1121 | 146 |
实现方案(Python Pandas)
针对2万行的数据量,用Pandas处理效率最优,步骤如下:
- 拆分非Fee行与Fee行
- 对Fee行按匹配键(Week/Store/ID)分组求和Total
- 将求和结果与非Fee行合并,累加Total字段
- 清理冗余列,输出最终结果
代码实现
import pandas as pd # 读取数据(实际场景可替换为pd.read_csv或其他数据源) data = pd.DataFrame([ [15, 'US1', 'RE-G', 'T3400', 200], [15, 'US4', 'TO', 'T656', 189], [15, 'US1', 'Fee', 'T3400', 13], [16, 'US4', 'RD', 'T173', 15], [15, 'US4', 'Fee', 'T656', 98], [16, 'US4', 'Fee', 'T1121', 435], [17, 'US4', 'TO', 'T656', 189], [15, 'US1', 'Fee', 'T3400', 885], [16, 'US4', 'MX', 'T1121', 146] ], columns=['Week', 'Store', 'Type', 'ID', 'Total']) # 拆分非Fee行和Fee行 non_fee_records = data[data['Type'] != 'Fee'].copy() fee_records = data[data['Type'] == 'Fee'].copy() # 按匹配维度分组,计算Fee行的Total总和 fee_total_summary = fee_records.groupby(['Week', 'Store', 'ID'], as_index=False)['Total'].sum() # 合并非Fee行与Fee总和,累加Total merged_data = pd.merge( non_fee_records, fee_total_summary, on=['Week', 'Store', 'ID'], how='left', suffixes=('', '_fee') ) merged_data['Total'] = merged_data['Total'].fillna(0) + merged_data['Total_fee'].fillna(0) # 整理结果,移除冗余列 final_result = merged_data.drop('Total_fee', axis=1)[['Week', 'Store', 'Type', 'ID', 'Total']] # 输出结果(可替换为to_csv/to_excel保存) print(final_result.to_markdown(index=False))
执行结果
| Week | Store | Type | ID | Total |
|---|---|---|---|---|
| 15 | US1 | RE-G | T3400 | 1098 |
| 15 | US4 | TO | T656 | 287 |
| 16 | US4 | RD | T173 | 15 |
| 16 | US4 | MX | T1121 | 581 |
| 17 | US4 | TO | T656 | 189 |
内容的提问来源于stack exchange,提问作者ihavealotofquestions00
相关产品推荐
相关产品推荐

