如何计算熊猫中分类变量的滚动计数

时间:2015-09-08 18:50:49

标签: python pandas

我试图对数据框进行滚动计数。我遇到的问题是指定条件,因为它是一个字符串,而不是整数。下面的数据框是一个片段,以及一个字典片段。

    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

我不确定这是一个复杂的问题,还是我错过了大熊猫中显而易见的事情。整个弦乐概念让我很难开始。

2 个答案:

答案 0 :(得分: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获取累积总和,如@ Brian的回答

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

答案 1 :(得分:0)

这是你要找的吗?

df = pd.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']],
                  columns=['A'])
df
   A
0  a
1  a
2  a
3  b
4  b
5  a

df.groupby('A').cumcount()

0    0
1    1
2    2
3    0
4    1
5    3
dtype: int64

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.cumcount.html