2015-09-08 127 views
1

我正在嘗試對數據框執行滾動計數。我遇到的問題是指定條件,因爲它是一個字符串,而不是一個整數。下面的數據框是一個片段,還有一個字典片段。如何計算大熊貓分類變量的滾動計數

GameID Event 
0 100  NaN 
1 100  NaN 
2 100  Ben 
3 100  NaN 
4 100  Steve 
5 100  Ben 
6 100  NaN 
7 100  Steve 
8 100  NaN 
9 100  NaN 
10 101  NaN 
11 101  NaN 
12 101  Joe 
13 101  NaN 
14 101  Will 
15 101  Joe 
16 101  NaN 
17 101  Will 
18 101  NaN  
19 101  NaN 



gamedic = {'100':['Ben','Steve'], '101':['Joe','Will']} 

最終,我希望數據框看起來像下面這樣。我爲這個例子命名了Ben和Steve的專欄,但實際上他們將是First和Second,對應他們在字典中的位置。

GameID Event Ben Steve 
0 100  NaN  0 0 
1 100  NaN  0 0 
2 100  Ben  0 0 
3 100  NaN  1 0 
4 100  Steve 1 0 
5 100  Ben  1 1 
6 100  NaN  2 1 
7 100  Steve 2 1 
8 100  NaN  2 2 
9 100  NaN  2 2 
10 101  NaN  0 0 
11 101  NaN  0 0 
12 101  Joe  0 0 
13 101  NaN  1 0 
14 101  Will 1 0 
15 101  Joe  1 1 
16 101  NaN  2 1 
17 101  Will 2 1 
18 101  NaN  2 2 
19 101  NaN  2 2 


pd.rolling_count(df.Event, 1000,0).shift(1) 
ValueError: could not convert string to float: Steve 

我不確定這是一個複雜的問題還是我在熊貓中丟失了明顯的東西。整個字符串概念使我很難繼續前進。

+0

這只是一個遊戲以下...我試圖groupby,但我的主要問題是與字符串。期望的輸出現在在問題 - 謝謝 – itjcms18

+0

WRT:「這是一個複雜的問題,或...缺少明顯的熊貓」。通常情況下,處理有序的派生數據(像這樣)對於熊貓來說是非常複雜的。熊貓使許多事情變得簡單,但其中大多數是無序的操作,如尋找手段和分組。 –

回答

1

首先,你想用你的字典來獲得一個只包含「第一」,「第二」一欄。我想不出一個聰明的辦法做到這一點所以我們只遍歷行:

import numpy as np 
df['Winner'] = np.nan 
for i,row in df.iterrows(): 
    if row.Event == gamedic[row.GameID][0]: 
     df['Winner'].ix[i] = 'First' 
    if row.Event == gamedic[row.GameID][1]: 
     df['Winner'].ix[i] = 'Second' 

您可以使用pd.get_dummies到字符串列(代表一個分類變量)來指示變量轉換;你的情況,這會給你

pd.get_dummies(df.Winner) 
Out[46]: 
    First Second 
0  0  0 
1  0  0 
2  1  0 
3  0  0 
4  0  1 
5  1  0 
6  0  0 
7  0  1 
8  0  0 
9  0  0 
10  0  0 
11  0  0 
12  1  0 
13  0  0 
14  0  1 
15  1  0 
16  0  0 
17  0  1 
18  0  0 
19  0  0 

您可以pd.concat添加這些到您的原始數據幀:

df = pd.concat([df,pd.get_dummies(df.Winner)],axis=1) 

然後你就可以得到你與groupby.cumsum累計總和爲@布賴恩的回答

df.groupby('GameID').cumsum() 
Out[60]: 
    First Second 
0  0  0 
1  0  0 
2  1  0 
3  1  0 
4  1  1 
5  2  1 
6  2  1 
7  2  2 
8  2  2 
9  2  2 
10  0  0 
11  0  0 
12  1  0 
13  1  0 
14  1  1 
15  2  1 
16  2  1 
17  2  2 
18  2  2 
19  2  2