如何按索引拼接多个DataFrame的列,实现同索引行值对齐合并
解决方案
有两种优雅高效的通用实现方式,可覆盖任意数量、任意列组合的DataFrame合并场景:
方案1:concat后按索引聚合
如果你的每个索引在同一列下最多只有一个有效值,直接对按行拼接后的结果按索引聚合即可:
import pandas as pd import numpy as np from functools import reduce # 示例数据 df1 = pd.DataFrame(np.array([[5], [4], [24]]), columns=['A'], index=[1, 2, 3]) df2 = pd.DataFrame(np.array([[19], [16], [9]]), columns=['A'], index=[4, 5, 7]) df3 = pd.DataFrame(np.array([[49], [36], [12]]), columns=['B'], index=[1, 2, 3]) df4 = pd.DataFrame(np.array([[18], [23], [91]]), columns=['B'], index=[6, 7, 8]) dfs = [df1,df2,df3,df4] # 核心代码 result = pd.concat(dfs, axis=0).groupby(level=0).sum(min_count=1) # 若需保留同一列的第一个有效值而非求和,可替换为.groupby(level=0).first() # 若需保留同一列的最后一个有效值,替换为.groupby(level=0).last()
优点:代码极简,性能高,适合大数据量场景;
min_count=1保证全NaN的列不会被转为0。
方案2:reduce+外连接merge
如果存在同一索引同一列有多个不同值的场景,需要明确保留所有值(自动加后缀区分),用索引外连接更稳妥:
result = reduce(lambda left, right: pd.merge(left, right, left_index=True, right_index=True, how='outer'), dfs)
优点:完全符合关系型数据库的join逻辑,不会隐式合并值,结果更可控。
两种方案输出结果完全匹配预期:
A B 1 5.0 49.0 2 4.0 36.0 3 24.0 12.0 4 19.0 NaN 5 16.0 NaN 6 NaN 18.0 7 9.0 23.0 8 NaN 91.0
内容的提问来源于stack exchange,提问作者Ivan Shelonik
相关产品推荐
相关产品推荐

