如何从列列表的最大行中创建包含列名的列

时间:2019-10-21 23:21:12

标签: python pandas

我有一个如下所示的df:

   time                 A                B                 C 
    0                   0                19                19    
    1                   0                 4                 4     
    2                   0                 0                 0     
    3                   0                 0                 0     
    4                   0                 4                 4  

我想创建一个新列,以产生列名,以表示A,B和C列之间每行的最大值。如果所有值均为0,则应产生NaN。如果有平局,则应产生两个值。我从这里开始有一个有用的答案,但是当所有列均为0并且不处理联系时,此函数将产生第一列名称。

name of column, that contains the max value

我想要的是这个

   time                 A                B              C          MAX
    0                   0                18             19       C
    1                   0                 4              4    [B,C]
    2                   0                 0              0      NaN 
    3                   0                 0              0      NaN
    4                  10                 4              4        A

1 个答案:

答案 0 :(得分:2)

您可以使用Apply:

def ma(xs):
    lst = [name for name, x in zip(xs.index, xs) if x == max(xs) and x > 0]

    if len(lst) == 1:
        return lst[0]

    return lst or np.nan


df['max'] = df[['A', 'B', 'C']].apply(ma, axis=1)

print(df)

输出

   time   A   B   C     max
0     0   0  18  19       C
1     1   0   4   4  [B, C]
2     2   0   0   0     NaN
3     3   0   0   0     NaN
4     4  10   4   4       A