簡體   English   中英

Python Pandas日期分組依據計數計算閾值的第一個實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM