基于日期时间和ID的大熊猫数量

时间:2020-05-11 01:11:22

标签: python pandas datetime count cumulative-sum

我试图在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

我正在尝试以这种特定方式添加一列计数,仅在特定日期每个“是”的一次即可:

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您可以在groupby之后用cumsumcumcount(不是drop_duplicates)来完成,然后像这样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