拥有过去10年所有客户的交易数据,我有一个数据框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')
答案 0 :(得分: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
答案 1 :(得分: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()
会返回一个数据帧,这不是您想要的。