You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中基于Pandas DataFrame计算剩余采购金额与数量

问题描述

我有两个Pandas DataFrame(Purchases和Sales),结构如下:

PURCHASE 表

NameitemvoucherAmtQty
AItem1Purchase10000100
BItem2Purchase50050
BItem1Purchase200020
CItem3Purchase1000100
DItem4Purchase500100
AItem3Purchase500050

SALES 表

NameitemvoucherAmtQty
AItem1Sales530050
BItem2Sales45040
BItem1Sales167515
CItem3Sales1800100

需要生成一个输出DataFrame:当某用户(Name)销售了对应商品(item)时,将Purchases中的Amt和Qty减去Sales中对应的数值,得到剩余的Amt和Qty。具体要求:

  • 所有已销售的商品需从Purchase中扣除对应数值,剩余数据存入新DataFrame
  • 即使无销售记录的用户(如D)也需包含在输出中

期望输出格式如下:

OUTPUT DATAFRAME

NameitemvoucherAmtQty
AItem1Remaining470050
AItem3Remaining500050
BItem2Remaining5010
BItem1Remaining3255
CItem3Remaining-8000
DItem4Remaining500100

附DataFrame初始化代码:

import pandas as pd

Purchases = {
    "Name": ["A", "B", "B", "C", "D", "A"],
    "item": ["Item1", "Item2", "Item1", "Item3", "Item4", "Item3"],
    "voucher": ["Purchase", "Purchase", "Purchase", "Purchase", "Purchase", "Purchase"],
    "Amt": [10000, 500, 2000, 1000, 500, 5000],
    "Qty": [100, 50, 20, 100, 100, 50],
}

Purchases = pd.DataFrame(Purchases)

Sales = {
    "Name": ["A", "B", "B", "C"],
    "item": ["Item1", "Item2", "Item1", "Item3"],
    "voucher": ["Sales", "Sales", "Sales", "Sales"],
    "Amt": [5300, 450, 1675, 1800],
    "Qty": [50, 40, 15, 100],
}

Sales = pd.DataFrame(Sales)
解决方案

可以通过左连接将Purchases和Sales按Name和item关联,然后计算剩余的Amt和Qty,最后整理格式:

# 1. 提取Sales中需要的列并重命名,避免连接后列名冲突
sales_sub = Sales[["Name", "item", "Amt", "Qty"]].rename(columns={"Amt": "Sales_Amt", "Qty": "Sales_Qty"})

# 2. 左连接Purchases和Sales数据,确保所有Purchase记录都被保留
merged = Purchases.merge(sales_sub, on=["Name", "item"], how="left")

# 3. 计算剩余Amt和Qty:无销售记录的用0代替,再执行减法
merged["Remaining_Amt"] = merged["Amt"] - merged["Sales_Amt"].fillna(0)
merged["Remaining_Qty"] = merged["Qty"] - merged["Sales_Qty"].fillna(0)

# 4. 整理成期望的输出格式
output = merged[["Name", "item"]].assign(
    voucher="Remaining",
    Amt=merged["Remaining_Amt"],
    Qty=merged["Remaining_Qty"]
)

# 查看结果
print(output)

代码说明:

  • 第一步提取Sales核心列并重命名,防止连接后Amt和Qty列名重复
  • 左连接保证Purchases中的所有记录都被保留,即使没有对应销售数据
  • 用fillna(0)处理无销售记录的行,确保减法计算正常执行
  • 最后通过assign方法添加voucher列,整理成目标输出结构

运行代码后得到的结果与期望输出完全一致。

内容的提问来源于stack exchange,提问作者spectre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:47:04