我的系统
视窗 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 与使用 eq
与 axis=0
进行比较maxval
,然后将 apply
与 lambda
一起使用以生成布尔掩码来屏蔽列并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