Python通过日期groupby计数计算阈值的第一个实例
拥有过去10年所有客户的交易数据,我有一个数据框架df: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
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