2016-07-06 42 views
1

我的系統添加列大熊貓數據幀包含每一行的最大值和相應的列名

Windows 7中,64位

蟒蛇3.5.1

挑戰

我想這應該很容易,但盡我所能,很難完成,甚至難以解釋。我希望下面的可重複的例子可以解釋這個問題。在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中,因爲這沒有多大意義。預先感謝,如果有人在這裏有趣的。

回答

3

可以使用eqaxis=0比較反對maxval東風,然後用applylambda產生boolean值面具掩蓋列和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