Pandas如何合并聚合两个DataFrame并实现对应列值相减
Pandas 按PLU匹配计算采购与销售差值的实现方案
你已经完成两个表按PLU聚合去重、QTY求和的预处理后,直接用以下两种方法即可实现差值计算,两种方法都经过示例数据验证。
方法1:表合并后直接计算(逻辑直观,适合新手)
通过merge按PLU字段匹配两个表的记录,区分采购量和销售量列后直接做减法即可,逻辑和Excel的VLOOKUP匹配计算一致,容易排查问题。
# 前置预聚合代码(你已经实现过的去重求和步骤) # final_purch_agg = final_purch.groupby("PLU", as_index=False)["QTY"].sum() # pmix_diff_agg = pmix_diff.groupby("PLU", as_index=False)["QTY"].sum() # 按PLU匹配合并 merge_df = final_purch_agg.merge( pmix_diff_agg, on="PLU", how="inner", # 仅保留两个表都存在的PLU;要保留仅入库无销售的PLU就改为"left" suffixes=("_in", "_out") # 给两个表的QTY列加后缀区分 ) # 计算剩余库存 merge_df["stock_left"] = merge_df["QTY_in"] - merge_df["QTY_out"]
基于你给出的示例数据,运行后得到的结果如下:
| PLU | QTY_in | QTY_out | stock_left |
|---|---|---|---|
| 12345678 | 12 | 9 | 3 |
| 90123456 | 7 | 3 | 4 |
| 78901234 | 2 | 1 | 1 |
方法2:索引对齐运算(代码简洁,性能更好)
Pandas的Series对象会自动按索引值匹配做运算,你可以把PLU设为索引后直接对QTY列做减法,代码更短,处理大数据量时速度更快。
# 前置预聚合代码同上 # final_purch_agg = final_purch.groupby("PLU", as_index=False)["QTY"].sum() # pmix_diff_agg = pmix_diff.groupby("PLU", as_index=False)["QTY"].sum() # 设PLU为索引后直接做减法,自动按PLU匹配 stock_result = ( final_purch_agg.set_index("PLU")["QTY"] .sub(pmix_diff_agg.set_index("PLU")["QTY"], fill_value=0) # fill_value=0代表缺项时默认值为0,避免出现空值 .reset_index(name="stock_left") )
注意:如果存在PLU仅在其中一个表出现的场景,
fill_value=0会自动把缺失的对应值按0处理:比如某PLU只有入库记录没有销售记录,销售量默认按0算,剩余库存等于入库量;如果只有销售记录没有入库记录,入库量默认按0算,剩余库存为负数。
内容的提问来源于stack exchange,提问作者Kyle XCVI
相关产品推荐
相关产品推荐

