Pandas比较类似的DataFrames并得到Min

Dan*_*ty2 3 python compare min dataframe pandas

给出以下数据框架:

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
Run Code Online (Sandbox Code Playgroud)

我想比较它们以找到每个相应行中的最低值,同时保留两个行中的所有行索引.这是我正在寻找的结果:

    A       B
A   1.0     4.0
B   2.0     2.0
C   NaN     NaN
D   4.0     4.0
E   NaN     6.0
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Vai*_*ali 6

您可以连接dfs,然后使用groupby保持最小值

df = pd.concat([d1,d2])
df = df.groupby(df.index).min()
Run Code Online (Sandbox Code Playgroud)

你得到

    A   B
A   1.0 4.0
B   2.0 2.0
C   NaN NaN
D   4.0 4.0
E   NaN 6.0
Run Code Online (Sandbox Code Playgroud)

编辑:来自@root和@ScottBoston的更简洁的解决方案

pd.concat([d1, d2]).groupby(level=0).min()
Run Code Online (Sandbox Code Playgroud)

  • 或者在一行`pd.concat([d1,d2]).groupby(level = 0).min()` (4认同)
  • 或者df = df.groupby(df.index).min() (3认同)

Psi*_*dom 6

aligning首先是两个数据框(索引和列)的另一个选项,然后使用numpy.fmin:

pd.np.fmin(*d1.align(d2))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

不那么复杂:

d1, d2 = d1.align(d2)
pd.np.fmin(d1, d2)
Run Code Online (Sandbox Code Playgroud)