如何合并23个DataFrame?基于RowNo列执行外连接并保留所有行
合并多个同结构DataFrame并基于RowNo做外连接填充非空值
你可以通过以下方法实现23个同列名DataFrame的外连接合并,同时保留所有RowNo并自动填充各列的非空值:
1. 把所有DataFrame存入列表
先将23个DataFrame整理到一个列表中:
import pandas as pd from functools import reduce # 替换成你的23个DataFrame dfs = [df1, df2, df3, ..., df23]
2. 累积合并并填充缺失值
利用combine_first实现外连接效果(保留所有行),同时用后续DataFrame的非空值填充前面的缺失值。通过reduce可以对列表中的DataFrame依次执行合并:
# 注意:如果实际列名是示例中的"Row No",请替换成对应名称 dfs_indexed = [df.set_index("RowNo") for df in dfs] merged_df = reduce(lambda left, right: left.combine_first(right), dfs_indexed) merged_df = merged_df.reset_index()
示例验证
用你提供的两个测试DataFrame验证:
# 构造示例数据 df1 = pd.DataFrame({ "Row No": [112, 115], "Horse": ["", "Winx"], "Weight": [55, ""] }) df2 = pd.DataFrame({ "Row No": [112, 115, 117], "Horse": ["Black", "Winx", "Pharlap"], "Weight": ["", 54, 51] }) # 执行合并 dfs = [df1.set_index("Row No"), df2.set_index("Row No")] result = reduce(lambda l, r: l.combine_first(r), dfs).reset_index() print(result)
输出与你的期望完全一致:
Row No Horse Weight 0 112 Black 55 1 115 Winx 54 2 117 Pharlap 51
额外提示
- 如果
RowNo存在重复值,建议先去重再合并,避免结果出现重复行:dfs_clean = [df.drop_duplicates(subset="RowNo", keep="last") for df in dfs] - 合并顺序会影响填充逻辑:当前代码是用后面的DataFrame填充前面的缺失值,若要优先保留前面DataFrame的非空值,可反转列表顺序,或把
left.combine_first(right)改成right.combine_first(left)。
内容的提问来源于stack exchange,提问作者onthepunt
相关产品推荐
相关产品推荐

