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

pandas如何基于索引合并多个DataFrame列并将缺失值填充为0

实现方法

首先确认所有待合并的DataFrame都已将id列设置为索引,如果还未设置,先对每个df执行如下操作:

# 对所有待合并df都执行一遍该操作
df1 = df1.set_index('id')

方法1:使用concat横向拼接(最简便)

直接调用pandas的concat函数按列横向拼接,取所有索引的并集,缺失值填充0即可,支持任意数量的DataFrame合并,6个df直接按顺序传入列表就行:

import pandas as pd

all_df = pd.concat(
    [df1, df2, df3, df4, df5, df6],
    axis=1  # 指定按列横向拼接
).fillna(0).astype(int) # 空值填0,转整数避免出现0.0格式的浮点数

参数说明:

  • axis=1:指定横向按列拼接,而非纵向按行拼接
  • 拼接默认采用外连接逻辑,会自动保留所有df中出现过的id索引,正好匹配需求
  • fillna(0):把匹配不到位置的NaN值替换为0
  • astype(int):如果计数字段都是整数,加这一步可以把填充后的浮点数0.0转为整数0;如果本身有小数计数需求,去掉这步即可

方法2:使用join按索引关联

如果习惯用DataFrame的join方法,也可以用如下写法,效果完全一致:

all_df = df1.join(
    [df2, df3, df4, df5, df6],
    how='outer' # 外连接保留所有索引
).fillna(0).astype(int)

效果验证

用你给出的示例数据测试:

# 构造示例df
df1 = pd.DataFrame({'cnt1': [10,20,30,10,55,20]}, index=['A000','A001','A002','A010','A050','A317'])
df2 = pd.DataFrame({'cnt2': [10,20,20]}, index=['A000','A010','A316'])
df3 = pd.DataFrame({'cnt3': [20,20]}, index=['A010','A318'])

# 执行合并
all_df = pd.concat([df1, df2, df3], axis=1).fillna(0).astype(int)
print(all_df)

输出结果和预期结构完全一致:

cnt1  cnt2  cnt3
A000    10    10     0
A001    20     0     0
A002    30     0     0
A010    10    20    20
A050    55     0     0
A316     0    20     0
A317    20     0     0
A318     0     0    20

内容的提问来源于stack exchange,提问作者S M Shamimul Hasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:42:14