如何匹配两个DataFrame指定列计算差值并新增结果列
双DataFrame按键匹配计算差值的正确实现
错误原因说明
你之前的写法错误根源在于误用了Python原生的条件循环逻辑处理Pandas的结构化数据匹配需求:
- 第一个报错
ValueError: Can only compare identically-labeled Series objects:直接用==比较两个长度、行标签均不相同的Series列,Pandas不支持这种非对齐的逐元素比较 - 第二个报错
TypeError: unsupported operand type(s) for &: 'str' and 'str':比较运算符==优先级低于位运算符&,未给比较条件加括号时会先执行&运算,同时while循环对布尔Series做判断本身逻辑不成立
正确实现代码
Pandas内置的merge左连接可以完美匹配你的需求,核心逻辑是先按双键对齐两个表,再做差值计算,无匹配的DF2值填充为0即可:
import pandas as pd # 1. 重命名DF2的Qty字段,避免合并时重名冲突 DF2_adj = DF2.rename(columns={"Qty": "Qty_d2"}) # 2. 以ID、Item为双键左连接,保留DF1的全部7行数据 df_merged = DF1.merge(DF2_adj, on=["ID", "Item"], how="left") # 3. 计算新列,未匹配到的DF2值填充为0,不改变DF1原有Qty df_merged["Qty_new"] = df_merged["Qty"] - df_merged["Qty_d2"].fillna(0) # 4. 提取需要的字段,得到7行3列的最终结果 result = df_merged[["ID", "Item", "Qty_new"]]
结果验证
按照你给出的示例数据,计算后得到的结果如下:
| ID | Item | Qty_new |
|---|---|---|
| 123 | qwe | -5 |
| 123 | asd | 1 |
| 123 | zxc | 7 |
| 234 | ewr | -7 |
| 234 | sdf | 3 |
| 345 | xcv | 0 |
| 345 | qwe | -2 |
内容的提问来源于stack exchange,提问作者A_R
相关产品推荐
相关产品推荐

