将列添加到pandas数据框中,其中包含每行的最大值和相应的列名

时间:2016-07-06 11:59:23

标签: python pandas

我的系统

Windows 7,64位

python 3.5.1

挑战

我有一个pandas数据框,我想知道每行的最大值,并将该信息附加为新列。我还想知道最大值所在列的名称。我想在现有的数据框中添加另一列,其中包含可以找到最大值的列的名称。

this post中,R已经询问并回答了类似的问题。

可重复的示例

In[1]:
# Make pandas dataframe
df = pd.DataFrame({'a':[1,0,0,1,3], 'b':[0,0,1,0,1], 'c':[0,0,0,0,0]})

# Calculate max 
my_series = df.max(numeric_only=True, axis = 1)
my_series.name = "maxval"

# Include maxval in df
df = df.join(my_series)
df        

Out[1]:
    a  b  c  maxval
0   1  0  0  1
1   0  0  0  0
2   0  1  0  1
3   1  0  0  1
4   3  1  0  3

到目前为止一切顺利。现在为添加另一列到包含列名称的现有数据框部分:

In[2]:
?
?
?


# This is what I'd like to accomplish:
Out[2]:
        a  b  c  maxval maxcol
    0   1  0  0  1      a
    1   0  0  0  0      a,b,c       
    2   0  1  0  1      b
    3   1  0  0  1      a
    4   3  1  0  3      a

请注意,如果多列包含相同的最大值,我想返回所有列名。另请注意, maxval 列不包含在 maxcol 中,因为这没有多大意义。如果有人发现这很有趣,请提前致谢。

1 个答案:

答案 0 :(得分:3)

您可以使用maxvaleqaxis=0进行比较,然后将applylambda进行比较,以生成布尔掩码来屏蔽列和join他们:

In [183]:
df['maxcol'] = df.ix[:,:'c'].eq(df['maxval'], axis=0).apply(lambda x: ','.join(df.columns[:3][x==x.max()]),axis=1)
df

Out[183]:
   a  b  c  maxval maxcol
0  1  0  0       1      a
1  0  0  0       0  a,b,c
2  0  1  0       1      b
3  1  0  0       1      a
4  3  1  0       3      a