基于日期时间和 ID 的累积计数 Pandas

Datetime and ID Based Cumcount Pandas

我试图在 Pandas 列中实现累积计数,这有点棘手,它只为每个日期和 ID 号添加一次计数。

下面的图表将有助于解释,我当前的数据集如下所示:

ID     Date     Mention_of_Yes
XDA  11/19/2019     0
XDA  12/19/2019     1
XDA  12/19/2019     1
XDA  1/19/2020      1
XDA  2/19/2020      0
XDA  3/19/2020      1
JJL  11/2/2019      1
JJL  11/2/2019      1
JJL  12/2/20019     0
JJL  1/20/2020      1

我正在尝试添加一个以这种特定方式计算的列,在特定日期每个 "Mention's of Yes" 仅一次:

ID    Date      Mention_of_Yes    *Correct CumCount 
XDA  11/19/2019      0                     0    
XDA  12/19/2019      1                     1    
XDA  12/19/2019      1                     1** Only Counts Once Per Date (12/19/2019 in this case)
XDA  1/19/2020       1                     2    
XDA  2/19/2020       0                     2    
XDA  3/19/2020       1                     3
JJL  19/2/2019       0                     0
JJL  10/2/2019       0                     0    
JJL  11/2/2019       1                     1    
JJL  11/2/2019       1                     1** Only Counts Once Per Date (11/2/2019 in this case)
JJL  12/2/20019      0                     1    
JJL  1/20/2020       1                     2    

我尝试了 groupby 和 cumcount 的不同迭代,但似乎无法正确配置,就像我在下面使用的代码一样:

df['Correct_CumCount'] = df.groupby[('ID','Mention_of_Yes')].cumcount()+1

如有任何帮助,我们将不胜感激!

您可以在 drop_duplicates 之后使用 groupbycumsum(而不是 cumcount),然后 ffill 如:

df['Correct_CumCount'] = df.drop_duplicates(subset=['ID', 'Date', 'Mention_of_Yes'], 
                                            keep='first')\
                           .groupby('ID')['Mention_of_Yes'].cumsum()
df['Correct_CumCount'] = df['Correct_CumCount'].ffill().astype(int)

print (df)
    ID        Date  Mention_of_Yes  Correct_CumCount
0  XDA  11/19/2019               0                 0
1  XDA  12/19/2019               1                 1
2  XDA  12/19/2019               1                 1
3  XDA   1/19/2020               1                 2
4  XDA   2/19/2020               0                 2
5  XDA   3/19/2020               1                 3
6  JJL   11/2/2019               1                 1
7  JJL   11/2/2019               1                 1
8  JJL  12/2/20019               0                 1
9  JJL   1/20/2020               1                 2