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
ローマンの質問に関しては、IPythonの%timeit
コマンドがコードをベンチマークする便利な方法だと思います。
In [28]: %timeit df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
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)
次に、これら 3 つの答えは異なる結果をもたらします。
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