2013-04-01 28 views
3

如果這對於使用熊貓來說太棘手,那麼對熊貓來說是新的並且好奇。使用熊貓進行棘手的聚合

例輸入:

time  person game_id won 
----------------------------------- 
12:34:01 John  3   False 
12:34:04 Ringo 2   True 
12:35:05 John  3   False 
12:36:01 John  3   True 
12:36:12 Ringo 3   True 
12:36:41 Paul  4   False 
12:37:01 George 2   False 
12:37:41 George 2   False 

它顯示了一個號碼打了一些比賽隨着時間的人。 贏得的列表示該人是否在當時獲勝。

我想要輸出的是有多少人贏得每場比賽至少一次。 但是還有多少人玩過這款遊戲並且從來沒有獲勝。

輸出示例:

game_id won  count 
----------------------- 
2   True 1 
      False 1 
3   True 2 
      False 0 
4   True 0 
      False 1 
+1

不,不是太靠譜。你可以通過幾種方式在幾行中做到這一點:我使用'groupby'和'.nunique()'來做硬件。 (對我來說,統計總球員和曾經獲勝者的人數似乎更加容易,然後減去他們以獲得從未獲勝者。) – DSM

+0

嗨,Yasir!如果不使用熊貓,我會按照n * log(n)的順序執行一個方法。它的工作原理如下:字典: 首先我按人排序,然後由game_id排序,最後以won排序。然後循環遍歷所有行併爲(game_id,won = True)增加一個計數器(如果存在「True」條目)。否則,如果只有False條目,我會增加(game_id,won = False)。 最後我會打印出結果字典。 有可能是一種更優雅的方式來做到這一點使用熊貓。 –

+0

感謝帝斯曼!如果你能分享一些令人驚歎的細節。試圖爲laaaaarge數據集執行此操作。所以速度是關鍵。 –

回答

6

或多或少什麼@DSM在說:

In [3]: grouped = df.groupby('game_id') 

In [4]: won = grouped.won.sum() 

In [5]: DataFrame({True: won, False: grouped.person.nunique() - won}).stack() 
Out[5]: 
game_id  
2  False 1 
     True  1 
3  False 0 
     True  2 
4  False 1 
     True  0 
dtype: float64 
+0

感謝熊貓,她是超級巨星! –

4
s1 = (~df.groupby(["game_id", "person"]).won.agg(np.any)).groupby(level=0).sum() 
s2 = df.groupby(["game_id", "won"]).person.agg(lambda s:s.nunique()) 
df2 = s2.unstack() 
df2[False] = s1 
df2.fillna(0).unstack().swaplevel(0, 1).sort_index() 
+0

謝謝HYRY。您還可以處理由同一個人勝出的多場比賽的情況非常好。 –