2017-04-12 64 views
3

鉴于以下数据帧:熊猫比较类似DataFrames并获得最少

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首先是两个数据帧(索引和列),然后用numpy.fmin

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

enter image description here

少令人费解:

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

我喜欢这个!但你知道你只是把另一个工具放在我的工具箱中:-) – piRSquared

6

可以Concat的在DFS,然后使用GROUPBY保持分钟

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

你得到

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

编辑:从@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.Panelmin
另外请注意,这是推广到任意数量的dataframes的。

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