2013-10-21 14 views
10

数値と部分的に重複するインデックスを持つDataFramesのセットがあります。複数のDataFrameでインデックスが発生した場合は、それらを平均的にマージしたいと思います。 (それが複数回発生した場合に該当する場合、すなわち)平均を使ってパンダのデータフレームを結合する

col   col 
a 1  b  4 
b 2  c  5 
c 3  d  6 

は今、私はデータフレームをマージし、各指標の平均を取るしたいと思います:

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([1,2,3], columns=['col'], index=['a','b','c']) 
df2 = pd.DataFrame([4,5,6], columns=['col'], index=['b','c','d']) 

は、これは私に2データフレームを提供します。

は次のようになります。

col 
a  1 
b  3 
c  4 
d  6 

は、私が入社/いくつかの先進的なマージでこれを行うことができますか?このような

答えて

10

何か:周り

df3 = pd.concat((df1, df2)) 
df3.groupby(df3.index).mean() 

# col 
# a 1 
# b 3 
# c 4 
# d 6 

または他の方法で、@unutbuの答えのように:

pd.concat((df1, df2), axis=1).mean(axis=1) 
+0

おかげで、それは高速でした。パンダはとても驚くほどシンプルです。 –

4
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 
+0

+1私はまだパンダを学んでいます。どちらのソリューションが高速になるのでしょうか? –

+0

良い質問;)私はもっと大きなデータで両方を試してみるでしょう。最初の回答が勝つ。 –

+0

@unutbu回答をベンチマークしてくれてありがとうございます。しかし、パンダとデータ分析についてもっと練習が必要です。 –

関連する問題