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
相关产品推荐
相关产品推荐

