2017-04-12 7 views
3

取得:パンダは、同様のデータフレームを比較し、以下のデータフレームを考える分

d1=pd.DataFrame({'A':[1,2,np.nan],'B':[np.nan,5,6]}) 
d1.index=['A','B','E'] 

    A  B 
A 1.0  NaN 
B 2.0  5.0 
E NaN  6.0 

d2=pd.DataFrame({'A':[4,2,np.nan,4],'B':[4,2,np.nan,4]}) 
d2.index=['A','B','C','D'] 
    A  B 
A 4.0  4.0 
B 2.0  2.0 
C NaN  NaN 
D 4.0  4.0 

私は両方からすべての行のインデックスを維持しながら、それぞれの対応する行の最小値を見つけるために、それらを比較したいと思います。事前に

A  B 
A 1.0  4.0 
B 2.0  2.0 
C NaN  NaN 
D 4.0  4.0 
E NaN  6.0 

ありがとう: ここに私が探している結果です!

答えて

5

別のオプションaligningで2つのデータフレーム(インデックスとカラムの両方)を最初に使用し、次にnumpy.fmin:あまり

pd.np.fmin(*d1.align(d2)) 

enter image description here

複雑:min

d1, d2 = d1.align(d2) 
pd.np.fmin(d1, d2) 
+1

私はこれが大好き!しかし、あなたは私のツールボックスに別のツールを入れていることを知っています:-) – piRSquared

6

あなたは、DFSをCONCAT、その後、あなたが取得

df = pd.concat([d1,d2]) 
df = df.groupby(df.index).min() 

分に保つためにGROUPBYを使用することができます

A B 
A 1.0 4.0 
B 2.0 2.0 
C NaN NaN 
D 4.0 4.0 
E NaN 6.0 

EDIT:@rootと@ScottBostonからもっと簡潔なソリューション

pd.concat([d1, d2]).groupby(level=0).min() 
+3

又はDF = df.groupby(df.index).min() –

+4

又は単一ライン 'pd.concat([D1、D2])である。GROUPBY(レベル= 0).min()' – root

4

使用pd.Panelはまた、これはデータフレームの任意の数に一般化であることに注意してください。

pd.Panel(dict(enumerate([d1, d2]))).min(0) 

    A B 
A 1.0 4.0 
B 2.0 2.0 
C NaN NaN 
D 4.0 4.0 
E NaN 6.0 
関連する問題