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
相关产品推荐
相关产品推荐

