基于其他列中的最大值填充列(python)

基于其他列中的最大值填充列(python),python,pandas,Python,Pandas,我有一个表,每个列中都有值(a、B、C)。 我想用具有最大值的列的名称创建另一列(max_col)。所以,如果A列大于B或C,则填充“A” 下面的代码可以工作,但在有很多不同的列可供选择的情况下,它不是很“pythonic”或可伸缩性 import pandas as pd import numpy as np table = { 'A': [1,2,3,4,5,6], 'B':[2,4,1,5,3,8], 'C':[3,1,2,4,5,6]} df

我有一个表,每个列中都有值(a、B、C)。 我想用具有最大值的列的名称创建另一列(max_col)。所以,如果A列大于B或C,则填充“A”

下面的代码可以工作,但在有很多不同的列可供选择的情况下,它不是很“pythonic”或可伸缩性

import pandas as pd
import numpy as np

table = { 'A': [1,2,3,4,5,6],
          'B':[2,4,1,5,3,8],
          'C':[3,1,2,4,5,6]}

df = pd.DataFrame.from_dict(table)
df['total'] = df.max(axis=1)
df['max_col'] = np.nan

df['max_col'] = np.where( df['total'] == df['A'],'A',df['max_col'])
df['max_col'] = np.where( df['total'] == df['B'],'B',df['max_col'])
df['max_col'] = np.where( df['total'] == df['C'],'C',df['max_col'])

df
此外,此代码偏向于检查的最后一列,在第5行中,A和C值相同,但“max_col”用“C”填充,因为它是最后一个检查的列。理想情况下,在这种情况下,“max\u col”将填充为“No max”。

用于按最大值排列的列

但如果存在多个最大值,则获取布尔掩码,并按
max
比较所有值,然后求和
True
s->
True
s的过程类似于
1
s。因此,对于最终遮罩,获取更大的值,如
1

df['max_col'] = np.where(df.eq(df.max(axis=1), axis=0).sum(axis=1) > 1,
                        'No Max', 
                         df.idxmax(axis=1))
print (df)
   A  B  C max_col
0  1  2  3       C
1  2  4  1       B
2  3  1  2       A
3  4  5  4       B
4  5  3  5  No Max
5  6  8  6       B
详情:

print (df.eq(df.max(axis=1), axis=0))
       A      B      C
0  False  False   True
1  False   True  False
2   True  False  False
3  False   True  False
4   True  False   True
5  False   True  False

print (df.eq(df.max(axis=1), axis=0).sum(axis=1))
0    1
1    1
2    1
3    1
4    2
5    1
dtype: int64

print (df.idxmax(axis=1))
0    C
1    B
2    A
3    B
4    A
5    B
dtype: object
与numpy广播类似的解决方案:

arr = df.values
mask = (arr == arr.max(axis=1)[:, None]).sum(axis=1) > 1
df['max_col'] = np.where(mask, 'No Max', df.idxmax(axis=1))
print (df)
   A  B  C max_col
0  1  2  3       C
1  2  4  1       B
2  3  1  2       A
3  4  5  4       B
4  5  3  5  No Max
5  6  8  6       B
按注释编辑:

可以按子集筛选列:

cols = ['A','B']
df['max_col'] = np.where(df[cols].eq(df[cols].max(axis=1), axis=0).sum(axis=1) > 1, 
                        'No Max', 
                        df[cols].idxmax(axis=1))
print (df)
   A  B  C max_col
0  1  2  3       B
1  2  4  1       B
2  3  1  2       A
3  4  5  4       B
4  5  3  5       A
5  6  8  6       B

太好了,谢谢你的快速回答。您知道什么是只对有限数量的列进行比较的最佳方法吗。例如,假设A、B和C列是较大数据帧的一部分,我不想与其他列进行比较?