2013-05-29 4 views
0

Я пытаюсь лучше понять групповые действия панд.Использование операций группы pandas

В качестве примера предположим, что у меня есть dataframe, в котором есть список наборов, играемых в теннисных матчах.

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)] 

Я мог бы затем повторно этот новый забивает массив дат. Однако маловероятно, что это предпочтительный способ делать вещи.

Чтобы создать новый фреймворк данных с каждой оценкой даты и матча, как указано выше, есть ли лучший способ добиться этого, используя pandas 'api?

ответ

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 
Смежные вопросы