【问题标题】:Get Row and Column with Minimum value in Entire Pandas DataFrame在整个 Pandas DataFrame 中获取具有最小值的行和列
【发布时间】:2019-04-17 01:26:34
【问题描述】:

问题很简单,所以必须解决,但我找不到。

我想找出 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

我怎样才能得到这个简单的结果?

【问题讨论】:

  • 性能重要吗?
  • 处理一些缺失值是最重要的。然后是展示,然后是性能。

标签: python pandas


【解决方案1】:

用途:

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

另一个处理缺失值的 @John Zwinck 解决方案 - 使用 numpy.nanargmin

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://stackoverflow.com/a/3230123
ri, ci = np.unravel_index(np.nanargmin(df.values), df.shape)
print(df.iloc[[ri], [ci]])
     C2
R3  0.0

【讨论】:

  • 太棒了。忘记添加问题:实际 df 中有一些 np.nan 值。这段代码也能在那里工作吗?
  • @rnso - 当然,pandas 函数可以与 nans 很好地配合使用。
  • @rnso - 更改了处理缺失值的解决方案。
【解决方案2】:

我会这样得到索引:

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]df.iloc[[x], [y]],如 jezrael 的回答。
【解决方案3】:

或者min+min+dropna+T+dropna+T

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

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2015-10-30
    • 2020-05-02
    • 1970-01-01
    • 2020-06-04
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多