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

如何合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:45:40