0

パンダのグループ操作をよりよく理解しようとしています。

例として、テニスの試合で行われたセットのリストを含むデータフレームがあるとします。

tennis_sets = pd.DataFrame.from_items([
  ('date', ['27/05/13', '27/05/13', '28/05/13', '28/05/13',
            '28/05/13', '29/05/13', '29/05/13']),
  ('player_A',  [6, 6, 2, 6, 7, 6, 6]),
  ('player_B',  [4, 3, 6, 7, 6, 1, 0])
])

その結果

       date  player_A  player_B
0  27/05/13         6         4
1  27/05/13         6         3
2  28/05/13         2         6
3  28/05/13         6         7
4  28/05/13         7         6
5  29/05/13         6         1
6  29/05/13         6         0

特定の日に行われた各試合の総合スコアを決定したいと思います。これは次のようになります

       date  player_A  player_B
0  27/05/13         2         0
1  28/05/13         1         2
2  29/05/13         2         0

したがって、新しいnumpy配列を作成し、次のように繰り返すことでこれを行うことができます:

matches = tennis_sets.groupby('date')
scores = np.zeros((len(matches),2))
for i, (_, match) in enumerate(matches):
  a, b = match.player_A, match.player_B
  scores[i] = np.c_[sum(a>b), sum(b>a)]

その後、この新しいスコア配列を日付に再アタッチできます。ただし、これが好ましい方法であるとは考えにくいです。

上記のように各日付と一致スコアで新しいデータフレームを作成するには、パンダの api を使用してこれを達成できるより良い方法はありますか?

4

1 に答える 1

1

あなたの質問に答えるには、パンダでこれを行う方法があります。より洗練された解決策があるかもしれませんが、これは pandas groupby を使用して、日付でグループ化されたデータフレームの合計を実行する簡単な解決策です。

In [13]: tennis_sets
Out[13]:
       date  player_A  player_B
0  27/05/13         6         4
1  27/05/13         6         3
2  28/05/13         2         6
3  28/05/13         6         7
4  28/05/13         7         6
5  29/05/13         6         1
6  29/05/13         6         0

In [14]: tennis_sets["pA_wins"] = tennis_sets["player_A"] > tennis_sets["player_B"]

In [15]: tennis_sets["pB_wins"] = tennis_sets["player_B"] > tennis_sets["player_A"]

In [18]: tennis_sets
Out[18]:
       date  player_A  player_B pA_wins pB_wins
0  27/05/13         6         4    True   False
1  27/05/13         6         3    True   False
2  28/05/13         2         6   False    True
3  28/05/13         6         7   False    True
4  28/05/13         7         6    True   False
5  29/05/13         6         1    True   False
6  29/05/13         6         0    True   False

In [21]: matches = tennis_sets.groupby("date").sum()

In [22]: matches[["pA_wins", "pB_wins"]]
Out[22]:
          pA_wins  pB_wins
date
27/05/13        2        0
28/05/13        1        2
29/05/13        2        0
于 2013-05-29T14:59:01.133 に答える