In [22]: pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
Out[23]:
a 1
b 3
c 4
d 6
dtype: float64
关于Roman的问题,我发现IPython的%timeit
命令是一个方便的基准测试代码的方法:
In [28]: %timeit df3 = pd.concat((df1, df2))
1000 loops, best of 3: 617 µs per loop
In [29]: %timeit pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
1000 loops, best of 3: 577 µs per loop
In [39]: %timeit pd.concat((df1, df2), axis=1).mean(axis=1)
1000 loops, best of 3: 524 µs per loop
在这种情况下,
pd.concat(...).mean(...)
显得更快一些。但是我们应该测试更大的数据框以获得更有意义的基准测试结果。
顺便说一下,如果您不想安装IPython,可以使用
Python的timeit
模块 运行等效的基准测试。只需要进行一些更多的设置。
文档中有一些示例展示了如何做到这一点。
请注意,如果
df1
或
df2
在其索引中具有重复的条目,例如像这样:
N = 1000
df1 = pd.DataFrame([1,2,3]*N, columns=['col'], index=['a','b','c']*N)
df2 = pd.DataFrame([4,5,6]*N, columns=['col'], index=['b','c','d']*N)
然后这三个答案给出了不同的结果:
In [56]: df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
Out[56]:
col
a 1
b 3
c 4
d 6
pd.merge
可能不能给出您想要的答案:
In [58]: len(pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1))
Out[58]: 2002000
pd.concat((df1, df2), axis=1)
报错 ValueError:
In [48]: pd.concat((df1, df2), axis=1)
ValueError: cannot reindex from a duplicate axis