2017-07-18 108 views
2

擁有對所有客戶的交易數據在過去的10年裏,我有一個數據幀DF:Python的大熊貓日期GROUPBY數計算的閾值的第一個實例

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') 
+0

示例正確嗎?我認爲'X'應該顯示在'2016-12-13' – Wen

+0

正確的 - 謝謝你抓到它(原始數據遍歷段落,並且我在錯誤的地方添加了X) – jeangelj

+0

已修復!很抱歉 – jeangelj

回答

4

然後,你可以,我使用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  
+0

這個工程!非常感謝 – jeangelj

+0

很高興幫助,美好的一天 – Wen

+0

不一定是cumcount()+ 1嗎? – jeangelj

1

這裏亞去!

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']],這創建了一個DataFrame對象只有一列,名爲Customer_ID。因此,當您嘗試提取名爲year的列時,會得到一個KeyError,因爲該列不存在。另一個問題是,應用groupby(),然後agg()返回一個數據幀,這不是你想要的。

+0

它不是Op想要 – Wen

+0

謝謝,但這會顯示我每年,當一個客戶達到4訪問;我怎樣才能第一次舉報? – jeangelj

+0

啊我看到了,謝謝,編輯我的回覆。 – hausdork