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

Pandas实现不等行相似DataFrame按列匹配替换对应列值

问题场景

现有两个结构相似、行数不等的DataFrame,样例数据如下:

  • DataFrame1
stockname  quantity  purchase_price purchase_date   weight
0       BSHSL        34        102.0000    2020-09-01  0.06172
1     SBICARD         8        804.3410    2020-09-01  0.11863
2   SANGINITA       110         71.2500    2020-09-01  0.13902
3   TOUCHWOOD       218         50.1479    2020-09-01  0.19395
4      SOLARA        12        917.7250    2020-09-01  0.20000
5    SUMICHEM        41        269.8520    2020-09-01  0.20000
6  LIQUIDBEES        14        999.9900    2020-09-01  0.08668
  • DataFrame2
stockname  quantity  purchase_price purchase_date   weight
5  LIQUIDBEES        12          1000.0    2020-06-26  0.25399

需求:当两个DataFrame的stockname字段值相等时,用DataFrame1对应行的quantity减去DataFrame2匹配行的quantity,用差值替换DataFrame1原有的quantity值,未匹配的行保留原有数值不变。

可行实现方案

以下两种方法都可以实现需求,可根据数据规模选择:

方法1:字典映射(适合小数据量,写法简洁)

先把DataFrame2的股票名和对应持仓量转成字典做映射,再逐行判断更新:

# 生成股票名到持仓量的映射字典
qty_mapping = df2.set_index("stockname")["quantity"].to_dict()

# 更新df1的quantity列,匹配到的做减法,匹配不到的保留原值
df1["quantity"] = df1.apply(
    lambda row: row["quantity"] - qty_mapping[row["stockname"]] 
    if row["stockname"] in qty_mapping 
    else row["quantity"],
    axis=1
)

用提供的样例数据运行后,DataFrame1中LIQUIDBEES对应的quantity会从14更新为14-12=2,其余行数值不变。

方法2:左连接向量化计算(适合大数据量,性能更高)

如果数据量在十万行以上,优先用pandas内置的merge做向量化运算,运行速度远快于apply循环:

# 按stockname左连接,只取df2的quantity列并重命名避免列名冲突
merged_df = df1.merge(
    df2[["stockname", "quantity"]].rename(columns={"quantity": "df2_qty"}),
    on="stockname",
    how="left"
)

# 未匹配到的df2_qty填充为0,计算差值替换原quantity列
merged_df["quantity"] = merged_df["quantity"] - merged_df["df2_qty"].fillna(0)

# 删除临时列,得到更新后的DataFrame1
df1 = merged_df.drop(columns="df2_qty")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:01:11