

## やりたいこと

既に作成しているDataFrameに対して、新しく追加する列に、特定の条件のもと適した値を入れたいと思っています。  
今回はゲームの大会のデータを持ってきているのですが、そのゲームの対戦方式として、  
**1セット目：2人vs2人のバトル（2本先取で勝ち）  
2セット目：1人vs1人のバトル（2本先取で勝ち）  
3セット目：1人vs1人のバトル（3名の勝ち残りで相手を全滅させたら勝利）**  
となっており、 **2セット先取で試合に勝利** となっています。

既にはdfというデータフレームの中に列が［match（通算で何試合目か）,set（何セット目か）,game（セット内で何試合目か）,gamewinner(その１試合での勝者),team1(チーム１の名前),team2（チーム2の名前）］という風に入っています。

**↓現在のデータフレーム**

[code]

    print(df) 
    
    　　#match  #set  #game  #gamewinner  #team1  #team2
    #1    1      1     1          1         A       B
    #2    1      1     2          1         A       B    
    #3    1      2     1          2         A       B    
    #4    1      2     2          1         A       B
    #5    1      2     3          2         A       B
    #6    1      3     1          1         A       B
    #7    1      3     2          2         A       B
    #8    1      3     3          1         A       B
    #9    1      3     4          1         A       B
    #10   2      1     1          2         C       D
    
      ...続く 
    
[/code]

このようになっているデータフレームにsetwinner,matchwinnerという新たな列を追加し、そのセット全体/試合全体でどちらが勝利したのかを1つの行から分かるようにしたいと考えています。

**↓やりたいイメージ**

[code]

    print(df) 
    
    　　#match  #set  #game  #gamewinner  #team1  #team2  #setwinner  #matchwinner
    #1    1      1     1          1         A       B         1            1
    #2    1      1     2          1         A       B         1            1   
    #3    1      2     1          2         A       B         2            1    
    #4    1      2     2          1         A       B         2            1
    #5    1      2     3          2         A       B         2            1
    #6    1      3     1          1         A       B         1            1
    #7    1      3     2          2         A       B         1            1
    #8    1      3     3          1         A       B         1            1
    #9    1      3     4          1         A       B         1            1
    #10   2      1     1          2         C       D         2            1
    
[/code]

## わからないこと

前後の行の情報を用いないとできないため、どのようにしたらやりたいことが実装できるのかわからず、困っています。

## 試してみたこと

他行の情報を見なくてもだできる点に関してはこれで実装できたのですが、そのほかの場合が分かりませんでした。

[code]

    ♯1,2セット目において3ゲームまでもつれ込んだ場合、3ゲーム目の勝者がそのセットの勝者
    df.loc[(df["game"]==3)&(df["set"]!=3),"setwinner"] = df["gamewinner"]
    
    
[/code]

ご回答よろしくお願いします。

<https://teratail.com/questions/192733>
このサイトにも同様の質問をさせていただいたのですが回答がないため、こちらの掲示板ならわかる方もいるのではないかと思い投稿させていただきます。


CC BY-SA 4.0
2019-06-02T14:15:26.217
55458
2019-06-03T14:19:40.610
2020-06-17T08:14:45.997
-1
34558
question
python pandas
pandas で異なる行のデータを用いて新たな列を追加したい


各ゲームの勝利チーム名を表す列を追加した上で、`groupby` と `max` を使えば最多勝利チーム名が分かります。

[code]

    def getTeam(row):
        if row["gamewinner"] == 1:
            return row["team1"]
        return row["team2"]
    
    df["gamewinnerteam"] = df.apply(getTeam, axis=1)
    setwinner = df.groupby(["match", "set"]).gamewinnerteam.max()
    matchwinner = setwinner.groupby("match").max()
    
[/code]

あとはこうやって求まった `setwinner`, `matchwinner` を各行に代入してやれば目的は果たせます。

[code]

    # 例
    df["setwinnerteam"] = df.apply(lambda row: setwinner[row["match"], row["set"]], axis=1)
    
[/code]

ただ各行に格納するのは用途によっては冗長なので、`setwinner`, `matchwinner` だけあれば充分かもしれません。


CC BY-SA 4.0
2019-06-03T14:19:40.610
55492
2019-06-03T14:19:40.610
19110
55458
answer