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

如何合并3个仅少数列数据不同的Pandas DataFrame?

解决方案

针对你的需求,有两种简洁高效的方法可以实现,既能保留原有数据结构,又能精准填补最后5列的缺失值,同时保留其他位置的NaN:

方法一:使用combine_first逐步合并

combine_first的作用是用右侧DataFrame的非缺失值填补左侧DataFrame的缺失值,且不会覆盖原有非缺失数据,非常匹配你的场景:

import pandas as pd
import numpy as np

# 你的示例数据
df1 = pd.DataFrame({"A": [4, 5, 6, 7, 8, 9], "B": [2, 2, 2, 3, 3, 3], "C": [np.nan, np.nan, 5, 5, 6, 6]})
df2 = pd.DataFrame({"A": [4, 5, 6, 7, 8, 9], "B": [2, 2, 2, 3, 3, 3], "C": [4, 4, np.nan, np.nan, 6, 6]})
df3 = pd.DataFrame({"A": [4, 5, 6, 7, 8, 9], "B": [2, 2, 2, 3, 3, 3], "C": [4, 4, 5, 5, np.nan, np.nan]})

# 合并操作
result = df1.combine_first(df2).combine_first(df3)
print(result)

输出结果完全符合预期:

A  B    C
0  4  2  4.0
1  5  2  4.0
2  6  2  5.0
3  7  3  5.0
4  8  3  6.0
5  9  3  6.0

由于你的前62列数据完全一致,combine_first不会对这些列做任何修改,只会针对最后5列的缺失值,用后续DataFrame的非缺失值进行填补,完美保留其他位置的NaN。

方法二:concat后分组取首个非缺失值

先将三个DataFrame按行拼接,再按原行索引分组,取每组的第一个非缺失值:

result = pd.concat([df1, df2, df3]).groupby(level=0).first()
print(result)

这个方法的逻辑是:同一行的三个数据中,非缺失值会优先被选中(first()会取第一个遇到的非缺失值),前62列因为完全一致,无论取哪个都不会有问题,最后5列则会自动填补缺失值。

注意事项

  • 两种方法都不需要提前区分前62列和最后5列,代码会自动处理,适配你的9276行×67列的实际数据
  • 若最后5列存在多个非缺失值(你的示例中不存在这种情况),两种方法都会保留最早出现的非缺失值,符合常规合并逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:35:22