Python通过日期groupby计数计算阈值的第一个实例

Python通过日期groupby计数计算阈值的第一个实例,python,pandas,group-by,conditional-statements,Python,Pandas,Group By,Conditional Statements,拥有过去10年所有客户的交易数据,我有一个数据框架df: Customer_ID | date | year | Dollars ABC 2017-02-07 2017 456 ABC 2017-03-05 2017 167 ABC 2017-07-13

拥有过去10年所有客户的交易数据,我有一个数据框架df:

   Customer_ID | date             | year             | Dollars 
    ABC           2017-02-07         2017               456
    ABC           2017-03-05         2017               167
    ABC           2017-07-13         2017               345        
    ABC           2017-05-15         2017               406
    ABC           2016-12-13         2016               320
    ABC           2016-01-03         2016               305
    ABC           2016-10-10         2016               456
    ABC           2016-05-10         2016               175        
    ABC           2015-04-07         2015               145
    BCD           2017-09-08         2017               155
    BCD           2016-10-22         2016               274
    BCD           2016-10-19         2016               255
我想添加一个标志,当客户在一年内第一次进行第四次访问时

这就是输出:

   Customer_ID | date             | year             | Dollars  | Flag
    ABC           2017-02-07         2017               456
    ABC           2017-03-05         2017               167
    ABC           2017-07-13         2017               345        
    ABC           2017-05-15         2017               406
    ABC           2016-12-13         2016               320         X
    ABC           2016-01-03         2016               305
    ABC           2016-10-10         2016               456         
    ABC           2016-05-10         2016               175        
    ABC           2015-04-07         2015               145
    BCD           2017-09-08         2017               155
    BCD           2016-10-22         2016               274
    BCD           2016-10-19         2016               255
我本来打算这样做的,但它没有产生所需的输出,我不知道如何标记他们第一次第四次访问

   df ['Flag'] = np.where(df[['Customer_ID']].groupby(['year']).agg(['count'])>3, 'X','0')

然后,您可以试试这个,我使用的是
cumcount
(Ps:您可以通过
df.drop(['Count','Count2',axis=1)来删除列。
):

给你

df['Flag']=np.where(df.groupby(['Customer_ID','year']).cumcount()+1==4,'X','')
df['Flag']=np.where((df.groupby(['Customer\u ID','Flag']).cumcount()==0)和(df['Flag']='X'),'X','')

问题误会编辑,谢谢@Wen。在这里,最后一行为客户删除重复的
X
,这样,只有客户在一年内第一次进行4次购买时才会被标记


当您执行
df[['Customer\u ID']]
时,这将创建一个只包含一列的DataFrame对象,名为
Customer\u ID
。因此,当您试图提取名为
year
的列时,会得到一个
keyrerror
,因为该列不存在。另一个问题是应用
groupby()

这个例子对吗?我认为
X
应该出现在
2016-12-13
上,这是正确的-感谢您捕捉到它(原始数据浏览了段落,我在错误的位置添加了X)修复了!对不起,你的错误是什么?您是否收到了
KeyError:“year”
?是的,我收到的正是这个错误-此外,即使它可以工作,它也不会只标记他们第一次访问4次,但他们在一年中每次访问都不是Op wantThank,谢谢,但这会在每年客户访问4次时显示给我看;我怎么能只在第一次打上标记呢?非常感谢-解释很有帮助对不起,你指的是什么“最后,有一个问题是,只有在第四次打上时才放一个‘X’,详见上面的内容。”哦-你指的是温的答案,因为某种原因它消失了,重新出现了。请帮忙,不错的一天不是必须是cumcount()+1吗?在您不需要+1的情况下,第一个cumcount将返回0。如果您确实需要,您也可以添加它,对于np.where更改为df['count']==4
df['Count']=df.sort_values('date').groupby(['Customer_ID','year']).cumcount()
df['Count2']=df.sort_values('date').groupby(['Customer_ID','Count']).cumcount()
df['Flag']=np.where(((df['Count']==3) & (df['Count2']==0)),'X', ' ')


   Customer_ID       date  year  Dollars  Count  Count2 Flag
0          ABC 2017-02-07  2017      456      0       2     
1          ABC 2017-03-05  2017      167      1       1     
2          ABC 2017-07-13  2017      345      3       1     
3          ABC 2017-05-15  2017      406      2       1     
4          ABC 2016-12-13  2016      320      3       0    X
5          ABC 2016-01-03  2016      305      0       1     
6          ABC 2016-10-10  2016      456      2       0     
7          ABC 2016-05-10  2016      175      1       0     
8          ABC 2015-04-07  2015      145      0       0     
9          BCD 2017-09-08  2017      155      0       1     
10         BCD 2016-10-22  2016      274      1       0     
11         BCD 2016-10-19  2016      255      0       0