combine_first 是 dataframe 间按索引和列对齐的合并操作,用右侧非空值填充左侧空值并补全缺失行列;而 fillna 仅在单个 dataframe 内部填充,不涉及对齐与扩展。

combine_first 是什么,它和 fillna 有什么区别?
combine_first 的本质是“用右侧 DataFrame 的非空值去填充左侧 DataFrame 的空值”,但它不是简单覆盖,而是按索引(行+列)对齐后逐单元格合并。这和 fillna 的关键区别在于:fillna 只作用于单个 DataFrame 内部,而 combine_first 是两个 DataFrame 之间的对齐合并。
- 它会自动对齐 index 和 columns,缺失的行列会被补全(类似 outer join)
- 左侧 DataFrame 中非空值优先保留;只有当左侧对应位置为
NaN时,才取右侧值 - 右侧 DataFrame 中左侧没有的行列,也会被加入结果中
实际合并时必须注意索引和列名是否对齐
如果你直接传入两个 index 不同、columns 不同的 DataFrame,combine_first 会照常运行,但结果可能和预期不符——它不会报错,而是默默做 outer 对齐,容易漏掉数据或引入意外空列。
- 确保两个表的 index 类型一致(比如都是
int64或都是str),否则对齐失败,大量单元格变NaN - 列名必须完全相同(包括大小写、空格),
combine_first不做列映射或模糊匹配 - 如果只想按某几列对齐(比如只关心
"id"和"date"),建议先用set_index(["id", "date"])统一索引
示例:
df1 = pd.DataFrame({"A": [1, np.nan], "B": [np.nan, 2]}, index=[0, 1])
df2 = pd.DataFrame({"A": [np.nan, 3], "B": [4, np.nan]}, index=[1, 2])
result = df1.combine_first(df2)
# result.index 是 [0, 1, 2],columns 是 ["A", "B"],所有空位都被合理填充
遇到 dtype 不一致时会强制转成 object?
这是最常踩的坑:如果 df1["col"] 是 int64,而 df2["col"] 是 float64 或 string,combine_first 默认不会报错,但结果列 dtype 会退化为 object,后续做数值计算会出错。
- 解决办法:提前统一 dtype,例如用
df2["col"] = df2["col"].astype(df1["col"].dtype)(注意处理NaN兼容性) - 对整数列含
NaN的情况,Pandas 会自动转成Int64(nullable int),但前提是两边都用这个类型 - 如果右侧有字符串、左侧是数字,
combine_first仍会合并,但整列变成object,且无法再调用.sum()等数值方法
想只补特定列,而不是整个 DataFrame?
combine_first 是 DataFrame 级操作,不支持按列选择性合并。如果只想用 df2 的 "price" 列去补 df1 的空缺,不要写 df1.combine_first(df2[["price"]])——这样会导致其他列也被对齐补空(比如 df1 原有 "name" 列,若 df2 没这列,结果里就变成全 NaN)。
- 正确做法是:单独提取列,再用
fillna或update - 例如:
df1["price"] = df1["price"].fillna(df2.set_index("id")["price"])(前提是 index 对齐) - 或更稳妥:
df1 = df1.copy(); df1.update(df2[["price"]].set_index(df1.index), overwrite=False)
真正需要 combine_first 的场景,通常是两个结构相近、但采样/来源不同、需无损拼合的宽表,比如日志表和配置表按 ID 合并。一旦列太多、对齐稍有偏差,结果就很难 debug。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











