2013-05-29 85 views
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)] 

我可以然後重新裝這個新的成績數組的日期。但是,這似乎不太可能是做事的首選方式。

要創建一個新的數據框,每個日期和匹配分數如上,有沒有更好的方法,我可以使用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