如何计算Pandas分类变量的滚动计数

2024-05-03 09:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对数据帧进行滚动计数。我遇到的问题是指定条件,因为它是字符串,而不是整数。下面的数据帧是一个片段,还有一个字典片段。在

    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这两个列,但实际上它们将是第一列和第二列,与它们在字典中的位置相对应。在

^{pr2}$

我不确定这是一个复杂的问题,还是我在熊猫身上遗漏了一些显而易见的东西。整个弦的概念让我很难开始。在


Tags: 数据字符串event字典整数nan条件will
2条回答

首先,您需要使用字典来获得只包含“First”和“second”的列。我想不出一个聪明的方法来实现这一点,所以让我们迭代一下行:

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将字符串列(表示类别变量)转换为指示符变量;在您的示例中,这将为您提供

^{pr2}$

您可以使用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

这就是你要找的吗?在

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

{a1}

相关问题 更多 >