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

如何将df2合并至df1并在合并时用原字段填充NaN值?

问题:合并DataFrame时用原字段填充NaN值

我有两个DataFrame:df1和df2。df1包含列["id", "time", "cost", "quantity"],df2包含列["id", "time", "modified_cost", "modified_quantity"]。我用左连接将df2合并到df1:

df1 = df1.merge(df2[["id", "time", "modified_cost", "modified_quantity"]], on=["id", "time"], how="left")

但当df2与df1的["id", "time"]组合不匹配时,modified_cost和modified_quantity列会出现NaN值,我希望这些NaN用df1对应行的cost和quantity值替换。

示例代码与当前结果

import pandas as pd

df1 = pd.DataFrame({"id": [1,2,3,4], "time": [3, 4, 5, 6], "cost": [1.1, 2.2, 3.3, 4.4], "quantity": [10,20,30,40]})

df2 = pd.DataFrame({"id": [2,3,4], "time": [4, 5, 6], "modified_cost": [2.2, 3.3, 4.4], "modified_quantity": [20,30,40]}) 

df1 = df1.merge(df2, on=["id", "time"], how="left")

print(df1)

执行后输出:

id  time  cost  quantity  modified_cost  modified_quantity
0   1     3   1.1        10            NaN                NaN
1   2     4   2.2        20            2.2               20.0
2   3     5   3.3        30            3.3               30.0
3   4     6   4.4        40            4.4               40.0

期望结果

id  time  cost  quantity  modified_cost  modified_quantity
0   1     3   1.1        10            1.1                10.0
1   2     4   2.2        20            2.2               20.0
2   3     5   3.3        30            3.3               30.0
3   4     6   4.4        40            4.4               40.0

目前我仅了解合并后手动替换的方法:

df1.loc[df1.modified_cost.isna(), "modified_cost"] = df1[df1.modified_cost.isna()].cost 

希望找到更高效的实现方式。


解决方案

pandas的merge方法本身没有内置填充NaN的参数,必须在合并完成后进行填充处理,以下是几种更简洁高效的实现方式:

方法1:使用fillna直接映射填充

这是最直观的写法,直接用原字段填充对应modified_*列的NaN值:

# 先执行左连接合并
df1 = df1.merge(df2, on=["id", "time"], how="left")
# 填充modified_cost的NaN为cost的值
df1["modified_cost"] = df1["modified_cost"].fillna(df1["cost"])
# 填充modified_quantity的NaN为quantity的值
df1["modified_quantity"] = df1["modified_quantity"].fillna(df1["quantity"])

方法2:批量处理多列(适合字段较多的场景)

如果需要处理的字段对较多,可以通过字段映射批量处理,避免重复代码:

df1 = df1.merge(df2, on=["id", "time"], how="left")
# 定义目标字段与原字段的映射关系
field_mapping = {
    "modified_cost": "cost",
    "modified_quantity": "quantity"
}
# 循环批量填充
for target_col, source_col in field_mapping.items():
    df1[target_col] = df1[target_col].fillna(df1[source_col])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:49