2016-07-06 3 views
1

私のシステムは、各行の最大を含む、列名

のWindows 7、64ビット対応パンダのデータフレームに列を追加

のpython 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

あなたは、列とjoinそれらをマスクするブール値マスクを生成するためにlambdaapplyを使用し、その後、axis=0eqを使用してmaxvalに対してDFを比較することができます:

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 
関連する問題