如何基于多个DataFrame按多条件实现金额求和
解决方案
问题说明
我有一个用于提取筛选条件的DataFrame:
| id | 条件1 | 条件2 |
|---|---|---|
| 1 | 3/1/2022 | Black |
| 2 | 5/2/2022 | Black |
| 3 | 3/1/2022 | Blue |
需要用这些条件,对以下DataFrame的金额进行求和:
| id | 日期 | 颜色 | Amount |
|---|---|---|---|
| 1 | 3/1/2022 | Black | 15 |
| 2 | 5/2/2022 | Red | 10 |
| 3 | 3/1/2022 | Blue | 25 |
| 4 | 5/2/2022 | Red | 10 |
| 5 | 4/1/2022 | Black | 15 |
| 6 | 3/1/2022 | Black | 45 |
期望得到结果:
| id | 条件1 | 条件2 | Amount |
|---|---|---|---|
| 1 | 3/1/2022 | Black | 60 |
| 2 | 5/2/2022 | Black | 0 |
| 3 | 3/1/2022 | Blue | 25 |
实现代码
使用Pandas可以快速实现需求,代码如下:
import pandas as pd # 构建条件DataFrame df_conditions = pd.DataFrame({ 'id': [1, 2, 3], '条件1': ['3/1/2022', '5/2/2022', '3/1/2022'], '条件2': ['Black', 'Black', 'Blue'] }) # 构建数据DataFrame df_data = pd.DataFrame({ 'id': [1, 2, 3, 4, 5, 6], '日期': ['3/1/2022', '5/2/2022', '3/1/2022', '5/2/2022', '4/1/2022', '3/1/2022'], '颜色': ['Black', 'Red', 'Blue', 'Red', 'Black', 'Black'], 'Amount': [15, 10, 25, 10, 15, 45] }) # 按日期+颜色分组,计算金额总和 sum_amount = df_data.groupby(['日期', '颜色'])['Amount'].sum().reset_index() # 左连接条件表与求和结果,保留所有条件行 result = df_conditions.merge( sum_amount, left_on=['条件1', '条件2'], right_on=['日期', '颜色'], how='left' ) # 填充无匹配的金额为0,整理输出列 result['Amount'] = result['Amount'].fillna(0).astype(int) result = result[['id', '条件1', '条件2', 'Amount']] print(result)
代码解释
- 分组求和:先对数据DataFrame按
日期和颜色分组,计算每组的金额总和,得到每个条件组合的总金额。 - 左连接:用左连接关联条件表和求和结果,确保条件表的所有行都被保留,无匹配的组合会生成
NaN值。 - 空值处理:将
NaN值替换为0,满足无匹配时金额为0的要求,最后调整列顺序得到目标结果。
内容的提问来源于stack exchange,提问作者rushi
相关产品推荐
相关产品推荐

