获取 Pandas DataFrame 中最小值所在的行和列

3
问题很简单,解决方案也应该简单,但我找不到它。
我想找出Pandas DataFrame中哪一行和哪一列具有最小值,以及它是多少。
除了各种组合外,我已尝试以下代码:
df = pd.DataFrame(data=[[4,5,6],[2,1,3],[7,0,5],[2,5,3]], 
                 index = ['R1','R2','R3','R4'], 
                 columns=['C1','C2','C3'])

print(df)

print(df.loc[df.idxmin(axis=0), df.idxmin(axis=1)])

正在搜索的数据框 (df) 是:

    C1  C2  C3
R1   4   5   6
R2   2   1   3
R3   7   0   5
R4   2   5   3

loc命令的输出结果:

    C1  C2  C2  C1
R2   2   1   1   2
R3   7   0   0   7
R2   2   1   1   2

我需要的是:

    C2
R3   0

我该如何获得这个简单的结果?

性能很重要吗? - jezrael
处理一些缺失值是最重要的,然后是显示和性能。 - rnso
3个回答

6

使用:

a, b = df.stack().idxmin()
print(df.loc[[a], [b]])
    C2
R3   0

另一种解决缺失值的方法是使用 numpy.nanargmin 函数,以下是 @John Zwinck 的解决方案:

df = pd.DataFrame(data=[[4,5,6],[2,np.nan,3],[7,0,5],[2,5,3]], 
    index = ['R1','R2','R3','R4'], 
    columns=['C1','C2','C3'])

print(df)
    C1   C2  C3
R1   4  5.0   6
R2   2  NaN   3
R3   7  0.0   5
R4   2  5.0   3

#https://dev59.com/HHA75IYBdhLWcg3wkJ31#3230123
ri, ci = np.unravel_index(np.nanargmin(df.values), df.shape)
print(df.iloc[[ri], [ci]])
     C2
R3  0.0

好的。忘记在问题中添加:真实数据框中有一些np.nan值。这段代码也能正常工作吗? - rnso
@rnso - 当然,pandas函数与NaN一起工作得很好。 - jezrael
@rnso - 更改了处理缺失值的解决方案。 - jezrael

1
我会这样获取索引:

np.unravel_index(np.argmin(df.values), df.shape)

这比 df.stack().idxmin() 快得多。
它会给你一个元组,例如在你的示例中是 (2, 1)。将其传递给 df.iloc[] 来获取值。

它可以工作,但输出中没有行和列名称。如果df中有一些np.nan值,它还能正常工作吗? - rnso
如果你想忽略NAN值,只需使用nanargmin而不是argmin。如果你想要行和列的名称,你可以使用df.columns[x]df.index[y]或者像jezrael的答案中那样使用df.iloc[[x], [y]] - John Zwinck

1
或者 min+min+dropna+T+dropna+T:
>>> df[df==df.min(axis=1).min()].dropna(how='all').T.dropna().T
     C2
R3  0.0
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接