[英]Python Pandas date groupby count calculate first instance of threshold
擁有過去十年中所有客戶的交易數據,我有一個數據框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['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
來呀!
df['Flag'] = np.where(df.groupby(['Customer_ID','year']).cumcount() + 1 == 4, 'X','') df['Flag'] = np.where((df.groupby(['Customer_ID','Flag']).cumcount() == 0) & (df['Flag'] == 'X'), 'X','')
。
對於問題的誤解進行了編輯,謝謝@Wen。 在這里,最后一行為客戶刪除重復的X
,以便僅標記客戶在一年內第一次進行4次購買。
當您執行df[['Customer_ID']]
,這將創建一個只有一個名為Customer_ID
列的DataFrame對象。 因此,當您嘗試提取名為year
的列時,會得到一個KeyError
,因為該列不存在。 另一個問題是,先應用groupby()
然后再使用agg()
返回一個數據幀,這不是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.