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

