2016-10-30 6 views
2

私は選挙データでいっぱいのCSVファイルを作成しています。私はこのような「勝者」と呼ばれる新しい列を、作成するために、パンダのidxmax()関数を使用idxmax()pandasとの等価

 city  party1  party2  party3 
    0 city1  50   107  114 
    1 city2  181  323  326 
    2 city3  26   28   75 
    3 city4  32   47   59 
    4 ciy5  8   21   21 

:私の生のサンプルは、として表すことができる

mydf['winner'] = mydf[['party1','party2','party3']].idxmax(axis=1) 

私の目標が決定することでしたどちらの当事者が各都市で最初の位置にあったのかここでの結果:party2とparty3が同じスコアを持っているので、最後の生の

 city  party1  party2  party3  winner 
    0 city1  50   107  114   party3 
    1 city2  181  323  326   party3 
    2 city3  26   28   75   party3 
    3 city4  32   47   59   party3 
    4 ciy5  8   21   21   party2 

勝者の値は、falseです。

関数idxmaxの2つの値の等価性で1つの例外を含めることは可能ですか?その後、sum、行ごとにそれらをsubsetDataFrame.maxとの値を比較し、どこ最大の重複がある1として高い価値があるため

+0

だから、勝者の列の価値はどうあるべきですか?文字列party2とparty3の連結 – ayhan

+0

Personalityでは、「平等」のようなものが最高です! – Raphadasilva

答えて

3

あなたはDataFrame.eqを使用することができます。それではマスクs > 1maskによってidxmaxの上書き値を指定できます:

a = mydf[['party1','party2','party3']] 
mydf['winner'] = a.idxmax(axis=1) 

s = a.eq(a.max(axis=1), axis=0).sum(axis=1) 
print (s) 
0 1 
1 1 
2 1 
3 1 
4 2 
dtype: int64 

mydf['winner'] = mydf['winner'].mask(s > 1, 'Equality') 
print (mydf) 
    city party1 party2 party3 winner 
0 city1  50  107  114 party3 
1 city2  181  323  326 party3 
2 city3  26  28  75 party3 
3 city4  32  47  59 party3 
4 ciy5  8  21  21 Equality 

必要性も、mulことで、列の値によって、複数のdf値、その後applyjoinと最後strip,を削除する場合:

a = mydf[['party1','party2','party3']] 
df = a.eq(a.max(axis=1), axis=0) 
print (df) 
    party1 party2 party3 
0 False False True 
1 False False True 
2 False False True 
3 False False True 
4 False True True 

mydf['winner'] = df.mul(df.columns.to_series()) 
        .apply(','.join, axis=1) 
        .str.strip(',') 
print (mydf) 
    city party1 party2 party3   winner 
0 city1  50  107  114   party3 
1 city2  181  323  326   party3 
2 city3  26  28  75   party3 
3 city4  32  47  59   party3 
4 ciy5  8  21  21 party2,party3 
+0

こんにちはjerzrael、私は非常に気をつけて、最初のソリューションを試してみましたが、このエラーがあります:TypeError:mask()は2つの位置引数を取るが、3つは与えられました: -/... – Raphadasilva

+0

あなたのバージョンのpandas ? – jezrael

+0

私のlaptobはDebian上で動作します0.14.1を得ました。マスク機能を使用するには古すぎる? – Raphadasilva