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值替换为0astype(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
相关产品推荐
相关产品推荐

