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's timeit
moduleを使用して同等のベンチマークを実行できます。ちょっとだけセットアップが必要です。これを行う方法を示すdocs has some examples
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
おそらくあなたが望むような答えを出さないでしょう:
はとValueError上げながら210
In [58]: len(pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1))
Out[58]: 2002000
は:
In [48]: pd.concat((df1, df2), axis=1)
ValueError: cannot reindex from a duplicate axis
おかげで、それは高速でした。パンダはとても驚くほどシンプルです。 –