2017-10-26 3 views
1

したがって、高度なピボットの質問があります。これは、出力を与える、次のデータフレームすべての列をピボットしたくないときに、DataFrameを介して複数の列のセットをフラグ付き値のセットにピボットする方法

dfa = pandas.DataFrame([["g1","15","Annie","Bard"], ["g2","18","Lux","Annie"], ["g3","15","Olaf","Twitch"]], columns=["gameId", "duration", "Champ1", "Champ2"]) 

を考えてみましょう。次のスタックオーバーフローの問題、how to pivot complex dataframeのロジックを適用することにより

enter image description here

、私は

pandas.melt(dfa, id_vars=['gameId']) \ 
    .set_index('gameId')['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=0) \ 
    .agg(np.sum) 

enter image description here

を取得

しかし、私は期間列をピボットので、私は自分のコードを変更し、「value_vars」

pandas.melt(dfa, id_vars=['gameId'], value_vars = ['Champ1','Champ2']) \ 
    .set_index('gameId')['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=0) \ 
    .agg(np.sum) 

enter image description here

そして今、私は期間列を失うを追加する必要はありません。この列は一意ではないため索引ではありませんが、ピボットする必要はありません。私は 'id_vars'または 'set_index()'にadditのすべての組み合わせを試しましたが、動作しないようです。

思考?

ありがとうございます!次のように

答えて

1

あなたはMultiindexで両方のレベルで、その後​​と最後groupbyに、id_varsに列durationを追加することができます。

a = pd.melt(dfa, id_vars=['gameId', 'duration']) \ 
    .set_index(['gameId', 'duration'])['value'] \ 
    .str.get_dummies() 
    .sum(level=[0,1]) 
print (a) 
       Annie Bard Lux Olaf Twitch 
gameId duration         
g1  15   1  1 0  0  0 
g2  18   1  0 1  0  0 
g3  15   0  0 0  1  1 

と同じである何:

a = pd.melt(dfa, id_vars=['gameId', 'duration']) \ 
    .set_index(['gameId', 'duration'])['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=[0,1]) \ 
    .sum() 
print (a) 
       Annie Bard Lux Olaf Twitch 
gameId duration         
g1  15   1  1 0  0  0 
g2  18   1  0 1  0  0 
g3  15   0  0 0  1  1 
+0

おかげで、これは完璧です。私は 'gameId'、 'duration'を試しましたが、リストに登録されていなかったり、グループのレベルを持っていませんでした。 –

+0

ようこそ。 Btw、常に '0'、' 1'出力は 'sum'ではなく' max'を必要とします。 – jezrael

+0

それでは、duration = 15でどのようにクエリしますか?私はgameId = g1によってa.loc [: 'g1']で問い合わせることができますが、a.loc [:15]またはa.loc [: '15']は動作していないようです。 –

関連する問題