2017-07-18 105 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