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

Python中匹配多DataFrame的ID并合并为单一DataFrame的方法

实现多DataFrame按ID对齐合并并填充缺失值

当然有办法实现!这本质上是多DataFrame的外连接合并,并将缺失值填充为0的需求,用Pandas可以轻松搞定,我给你两种常用的实现方式:

方法一:逐步外连接合并(Merge)

这种方式逻辑清晰,适合逐步合并少量DataFrame:

步骤1:构造示例数据(模拟你的输入)

先把你的DataFrame转换成标准的Pandas结构(假设每个DataFrame都是ID+数值列的格式):

import pandas as pd

df1 = pd.DataFrame({'ID': ['1q2', '1q3', '1d4'], 'value': [123, 212, 234]})
df2 = pd.DataFrame({'ID': ['1q1', '1q2', '1q3', '1d4'], 'value': [223, 126, 42, 314]})
df3 = pd.DataFrame({'ID': ['1q2', '1q4', '1d3'], 'value': [923, 121, 423]})

步骤2:重命名数值列(区分来源)

为了合并后能清楚识别每个列对应哪个原始DataFrame,给数值列重命名:

df1 = df1.rename(columns={'value': 'df1'})
df2 = df2.rename(columns={'value': 'df2'})
df3 = df3.rename(columns={'value': 'df3'})

步骤3:外连接合并并填充0

使用merge做outer join(保留所有ID),再用fillna(0)把缺失值替换为0,最后转换为整数类型:

# 先合并df1和df2,再合并df3
df_merged = df1.merge(df2, on='ID', how='outer').merge(df3, on='ID', how='outer')
# 填充缺失值为0,并确保数值是整数
dfans = df_merged.fillna(0).astype({'df1': int, 'df2': int, 'df3': int})

print(dfans)

输出结果:

ID  df1  df2  df3
0  1q2  123  126  923
1  1q3  212   42    0
2  1d4  234  314    0
3  1q1    0  223    0
4  1q4    0    0  121
5  1d3    0    0  423

方法二:索引对齐合并(Concat)

如果需要合并的DataFrame数量较多,这种方式更紧凑,利用索引自动对齐的特性:

import pandas as pd

# 构造示例数据(同上)
df1 = pd.DataFrame({'ID': ['1q2', '1q3', '1d4'], 'value': [123, 212, 234]})
df2 = pd.DataFrame({'ID': ['1q1', '1q2', '1q3', '1d4'], 'value': [223, 126, 42, 314]})
df3 = pd.DataFrame({'ID': ['1q2', '1q4', '1d3'], 'value': [923, 121, 423]})

# 将每个DataFrame的ID设为索引,并重命名数值列
df_list = [
    df1.set_index('ID').rename(columns={'value': 'df1'}),
    df2.set_index('ID').rename(columns={'value': 'df2'}),
    df3.set_index('ID').rename(columns={'value': 'df3'})
]

# 按列合并,填充缺失值为0,最后重置索引恢复ID列
dfans = pd.concat(df_list, axis=1).fillna(0).astype(int).reset_index().rename(columns={'index': 'ID'})

print(dfans)

这个方法的输出和方法一完全一致,代码更简洁,适合批量合并场景。

关键说明

  • outer join/索引对齐:确保所有ID都被保留,不管它是否存在于某个原始DataFrame中
  • fillna(0):将合并后缺失的数值(即该ID在对应DataFrame中无记录)替换为0
  • astype(int):合并后缺失值填充0会默认是float类型,转换为整数更符合你的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:14:49