2017-07-15 18 views
2

グループをオーバーカウントplayer1player2の列には、それぞれroundでお互いに対戦する選手の名前が含まれています。パンダは、私は次のように見えるパンダのデータフレームを持って

ここで、プレーヤーAなどのトーナメントの参加を累計したいと考えています。擬似コードでは、これは意味:名前Aを持つプレイヤーがトーナメントIDあたりplayer1またはplayer2列のいずれかで起動した場合は、この(ノートのようになります。1.

結果によって、カウンタをインクリメント:私の例プレーヤーAに参加しました

ID round player1  player2  playerAparticipated 
1 1  A   B   1 
1 2  A   C   1 
1 3  B   D   1 
2 1  B   C   0 
2 2  C   D   0 
2 3  C   E   0 
3 1  B   C   2 
3 2  C   D   2 
3 3  C   A   2 

私の現在のステータスは、それぞれのプレイヤーがトーナメントに参加した場合、私は値1又は0示すを含む「ヘルパー」欄を追加したこと、である。ID S 1および3)とトーナメントで

ID round player1  player2  helper 
1 1  A   B   1 
1 2  A   C   1 
1 3  B   D   1 
2 1  B   C   0 
2 2  C   D   0 
2 3  C   E   0 
3 1  B   C   1 
3 2  C   D   1 
3 3  C   A   1 

私はちょうど1つの最後のステップ、例えば、所望の方法でhelper列をカウントcumsum()のスマートな使用を必要とすると思います。しかし、私はまだ解決策を考え出すことができませんでした。

+0

データフレーム内の値は必要ですか? groupby( 'ID')。count()) 'あなたにトーナメントの回数を与えるPlayer 'A '参加しました。 – rafasc

+0

はい、元のデータフレームの値を持つことをお勧めします。 – beta

答えて

4

私はあなたが必要だと思う:boolean indexingcumsumと最後reindexによってフィルタアウト0値を

  • set_index最初と列IDによって

    • drop_duplicatesのため行方不明インデックスは
    • 新しい列を作成する値のための0を追加by map

    df1 = df.drop_duplicates('ID').set_index('ID') 
    s = df1.loc[df1['helper'] != 0, 'helper'].cumsum().reindex(index=df1.index, fill_value=0) 
    df['playerAparticipated'] = df['ID'].map(s) 
    print (df) 
        ID round player1 player2 helper playerAparticipated 
    0 1  1  A  B  1     1 
    1 1  2  A  C  1     1 
    2 1  3  B  D  1     1 
    3 2  1  B  C  0     0 
    4 2  2  C  D  0     0 
    5 2  3  C  E  0     0 
    6 3  1  B  C  1     2 
    7 3  2  C  D  1     2 
    8 3  3  C  A  1     2 
    

    代わりmap可能な用途は、renamejoinです:

    df = df.join(s.rename('playerAparticipated'), on='ID') 
    print (df) 
        ID round player1 player2 helper playerAparticipated 
    0 1  1  A  B  1     1 
    1 1  2  A  C  1     1 
    2 1  3  B  D  1     1 
    3 2  1  B  C  0     0 
    4 2  2  C  D  0     0 
    5 2  3  C  E  0     0 
    6 3  1  B  C  1     2 
    7 3  2  C  D  1     2 
    8 3  3  C  A  1     2 
    
  • +1

    本当にreindex&map – cmaher

    +0

    あなたの答えに関連する1つの質問のこの使用のように:なぜ正確に 'set_index'が必要ですか?目的は何ですか? – beta

    +0

    私の解決策では、 'index'を作成することでカラムを手放すことができました。なぜなら、' helper'カラム – jezrael

    1

    私は少し遅く:)を調理することを@jezraelする同様のアプローチ。、helperが0である行をフィルタリング

    df = df.reset_index().set_index(['index','ID']) 
    #   round player1 player2 helper 
    # index ID 
    # 0  1  1  A  B  1 
    # 1  1  2  A  C  1 
    # 2  1  3  B  D  1 
    # 3  2  1  B  C  0 
    # 4  2  2  C  D  0 
    # 5  2  3  C  E  0 
    # 6  3  1  B  C  1 
    # 7  3  2  C  D  1 
    # 8  3  3  C  A  1 
    

    次とIDによってトーナメントの累積合計を取得し、結果を変数に割り当てる:

    まず、あなたのインデックスにIDを移動

    tournament_count = df[df['helper'] > 0].groupby(['ID','helper']).first().reset_index(level=1)['helper'].cumsum().rename("playerAparticipated") 
    # ID 
    # 1 1 
    # 3 2 
    

    は最後に、DFとtournament_count DATAFRAMEに参加:

    df.join(tournament_counts, how="left").fillna(0) 
    #   round player1 player2 helper tournament_counts 
    # index ID 
    # 0  1  1  A  B  1    1.0 
    # 1  1  2  A  C  1    1.0 
    # 2  1  3  B  D  1    1.0 
    # 3  2  1  B  C  0    0.0 
    # 4  2  2  C  D  0    0.0 
    # 5  2  3  C  E  0    0.0 
    # 6  3  1  B  C  1    2.0 
    # 7  3  2  C  D  1    2.0 
    # 8  3  3  C  A  1    2.0 
    
    関連する問題