【问题标题】:Column name corresponding to largest value in pandas DataFrame [duplicate]pandas DataFrame中最大值对应的列名[重复]
【发布时间】:2018-12-07 03:53:26
【问题描述】:

对于以下数据框数据:

x  y  a b c 
2  6 12 1 2
1  2  4 6 8

我希望新列(即 d)中的结果返回仅在 a、b、c 中具有最大值的列名称。

cols
a
c

我正在尝试从三列中找到最大值并返回列名。但我不想选择数据集的所有行,而是只想选择这三列的行。我使用以下代码:

def returncolname(row, colnames):
    return colnames[np.argmax(row.values)]
data['colmax'] = data.apply(lambda x: returncolname(x, data.columns), axis=1)

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    我能想到的最快的解决方案是DataFrame.dot

    df.eq(df.max(1), axis=0).dot(df.columns)
    

    详情
    首先,计算每行的最大值:

    df.max(1)
    0    12
    1     8
    dtype: int64
    

    接下来,找出这些值的来源:

    df.eq(df.max(1), axis=0)     
           x      y      a      b      c
    0  False  False   True  False  False
    1  False  False  False  False   True
    

    我使用eq 来确保跨列正确广播比较。

    接下来,计算与列列表的点积:

    df.eq(df.max(1), axis=0).dot(df.columns)
    0    a
    1    c
    dtype: object
    

    如果最大值不是唯一的,使用

    df.eq(df.max(1), axis=0).dot(df.columns + ',').str.rstrip(',')
    

    获取以逗号分隔的列列表。例如,

    更改几个值:

    df.at[0, 'c'] = 12
    df.at[1, 'y'] = 8
    

    一切都是一样的,但请注意,我在每一列都附加了一个逗号:

    df.columns + ','
    Index(['x,', 'y,', 'a,', 'b,', 'c,'], dtype='object')
    
    df.eq(df.max(1), axis=0).dot(df.columns + ',')
    0    a,c,
    1    y,c,
    dtype: object
    

    从这里,去掉任何尾随的逗号:

    df.eq(df.max(1), axis=0).dot(df.columns + ',').str.rstrip(',') 
    0    a,c
    1    y,c
    dtype: object
    

    【讨论】:

    • 能详细解释一下吗?
    • @VroJ 已编辑,另请参阅我的脚注。
    • @VroJ 可以有多个最大值吗?
    • 这正是我想知道的。14左右有多个最大值。
    • 我通过在另一个数据框中获取数据并在问题中使用代码来做到这一点,但由于有 5,50,000 次观察,因此很难合并数据。
    【解决方案2】:

    如果您不介意返回最大值的第一次出现(或者如果最大值始终是唯一的),请使用 idxmax

    df[['a', 'b', 'c']].idxmax(1)
    

    0    a
    1    c
    dtype: object
    

    如果您需要所有出现的最大值,请使用coldspeed's answer

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 2020-05-02
      • 2023-01-25
      • 2022-10-24
      • 1970-01-01
      • 2021-04-24
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多