【问题标题】:Get column index of max value in pandas row获取熊猫行中最大值的列索引
【发布时间】:2022-07-25 21:54:05
【问题描述】:

我不仅要查找数据框行中的最大值,还要查找具有该值的特定列。如果有多个列的值,那么要么返回所有列的列表,要么只返回一个,都可以。

在这种情况下,我特别关心为单个给定行执行此操作,但如果有可以应用于数据框的解决方案,那也很好。

以下是我的意思的粗略概念。 row.max() 返回最大值,但我想要的函数 row.max_col() 返回具有最大值的列的名称。

>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [4,5,6]})
>>> row = df.iloc[0]
>>> row.max()
4
>>> row.max_col()
Index(['B'], dtype='object')

我目前的做法是这样的:

>>> row.index[row.eq(row.max())]
Index(['B'], dtype='object')

我不熟悉 pandas 如何优化所有内容,因此如果我在这里错了,我深表歉意,但我假设 row.index[row.eq(...)] 的线性时间增长与列数成正比。我正在处理少量列,所以这应该不是一个大问题,但我很好奇是否有一种方法可以像使用 .max() 而无需这样做之后的额外工作是寻找相等的值。

【问题讨论】:

  • 有一个函数可以做到这一点,idxmax()。您可以按行或按列应用它。
  • 你想要 max 和 idxmax 吗? df.agg(['max', 'idxmax'], axis=1) 之类的东西?
  • @sophocles 和 @henry-ecker - idxmax 正是我想要的,非常感谢

标签: python pandas dataframe


【解决方案1】:

假设源DataFrame包含:

   A  B
0  1  4
1  7  5
2  3  6
3  9  8

然后,在每个行中找到包含最大值的列名 (不仅是第 0 行),运行:

result = df.apply('idxmax', axis=1)

结果是:

0    B
1    A
2    B
3    A
dtype: object

但是如果你想获取 integer 列的索引 最大值,把上面的代码改成:

result = df.columns.get_indexer(df.apply('idxmax', axis=1))

这次的结果是:

array([1, 0, 1, 0], dtype=int64)

【讨论】:

    【解决方案2】:

    使用idxmax:

    >>> df
       A  B
    0  1  4
    1  2  5
    2  3  6
    
    >>> df.iloc[0].idxmax()
    'B'
    

    【讨论】:

      【解决方案3】:
      df1 = pd.DataFrame({
      'Id': ['00', '01', '02', '02', '01', '03'] ,
      
      'date': ['1990-12-31 ','1990-12-27 ','1990-12-28 ',
               '1990-12-28 ','1992-12-27 ','1990-12-30 '] , 
       
       'Population': ['700','200','300','400','500','100']        
               })
      print(df1)
      
      """
         Id         date Population
      0  00  1990-12-31         700
      1  01  1990-12-27         200
      2  02  1990-12-28         300
      3  02  1990-12-28         400
      4  01  1992-12-27         500
      5  03  1990-12-30         100
      """
      
      
      
      Max1 = df1.groupby('Id').apply( lambda df : df['Population'].values[df['Population'].values.argmax()]  )
      
      
      print(Max1)
      
      """
      Id
      00    700
      01    500
      02    400
      03    100
      dtype: object
      """
      
      Min1 = df1.groupby('Id').apply(lambda df : df['Population'].values[df['Population'].values.argmin()])
      
      print(Min1)
      
      """
      Id
      00    700
      01    200
      02    300
      03    100
      dtype: object
      
      """
      

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 2018-08-04
        • 2013-02-03
        • 2022-01-25
        • 1970-01-01
        • 2016-07-19
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多