【问题标题】:How to get the indexes of all minimum values in pandas dataframe?如何获取熊猫数据框中所有最小值的索引?
【发布时间】:2022-02-09 06:27:46
【问题描述】:

我有一个数据框:

df = pd.DataFrame({'A': [0, 0, 1], 'B': [1, 0, 0]}, index=['x', 'y', 'z'])

   A  B
x  0  1
y  0  0
z  1  0

对于每一行,我想要具有最低值的所有列的名称(编辑:每行),例如:

x  A
y  A
y  B
z  B

# or 

x  [A]
y  [A, B]
z  [B]

我知道idxmin() 给出了最低值的第一个实例:

df.idxmin(axis=1)

x    A
y    A
z    B

但是获取所有这些的有效方法是什么?

这个question 给出了特定列中具有最小值的所有行,但这并不是我想要的。

编辑:这是一个更好的玩具 df 用于获取每行中具有最小值的列名:

df2 = pd.DataFrame({'A': [1, 0, 6], 'B': [3, 0, 2]}, index=['x', 'y', 'z'])

   A  B
x  1  3
y  0  0
z  6  2

【问题讨论】:

  • 点赞,因为你找到了df.idxmin
  • 应该是每组整体的最小值吗?
  • @mozway 每行的最小值

标签: python pandas dataframe


【解决方案1】:

你可以使用groupby+transform('min'):

s = df.stack()
s[s.eq(s.groupby(level=0).transform('min'))]

输出:

x  A    0
y  A    0
   B    0
z  B    0

替代格式:

s = df.stack()
(s[s.eq(s.groupby(level=0).transform('min'))]
  .reset_index()
  .groupby('level_0')['level_1'].apply(list)
 )

输出:

level_0
x       [A]
y    [A, B]
z       [B]
Name: level_1, dtype: object

【讨论】:

  • 谢谢。 level=-1 在 groupby 中有什么作用? (似乎 1 级和 0 级都给出了相同的结果,至少对于这个玩具示例。)
  • 这表示多索引的最后(右)层;)
  • @hmg 我做错了,应该是 0 级才能获得每行的最小值。级别 -1 将获得每列的最小值(此处巧合相同)
【解决方案2】:

通过查找每个最小值并将返回 True 的列拉到列表中,将 df 转换为 bool

 s= df==df.min()

df['column_min']=s.agg(lambda s: s.index[s].values, axis=1)




 A   B   column_min
x  0  1        [A]
y  0  0     [A, B]
z  1  0        [B]

【讨论】:

  • OP 阐明了要求,您需要使用groupby 来获取每行的最小值;)
【解决方案3】:

这是一个单线,类似于@mozway 的第二种解决方案,但使用类似于@wwnde 的布尔掩码:

min_cols = df.eq(df.min(axis=1), axis=0).stack().groupby(level=0).apply(lambda x: x.index.get_level_values(1)[x].tolist())

输出:

x       [A]
y    [A, B]
z       [B]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2018-08-04
    • 2021-01-19
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2016-08-06
    • 2021-09-18
    相关资源
    最近更新 更多