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



我的系统

视窗 7,64 位

蟒蛇 3.5.1

挑战

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

这篇文章中,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 中,因为这没有多大意义。如果有人觉得这很有趣,请提前感谢。

您可以将 df 与使用 eqaxis=0 进行比较maxval,然后将 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

最新更新