我有一个包含如下用户数据的数据框:
|--user id--|--registration_date--|--voucher campaign--|--transaction id--|--price--|--purchase date--|
|--5433126--|-- 2015-05-23 --|-- tlp05 --|--68536116696879--|--18.00--|-- 2015-05-23--|
|--5433126--|-- 2015-05-23 --|-- tlp05 --|--68435132139899--|-- 7.00--|-- 2015-05-29--|
|--9865313--|-- 2015-06-01 --|-- zig15 --|--97889200016487--|--23.00--|-- 2015-06-15--|
|--7879463--|-- 2015-05-27 --|-- tlp10 --|-- NaN --|-- NaN --|-- NaN --|
...
我想创建一个额外的列,其中包含一个字符串,告诉我用户的整体购物事件:
Never 如果用户从未购买过任何东西;
Once 如果用户只买了一次东西;
Multiple 如果用户多次购买某物;
所以我想要的结果是这样的:
|--user id--|--registration_date--|--voucher campaign--|--transaction id--|--price--|--purchase date--|--activity--|
|--5433126--|-- 2015-05-23 --|-- tlp05 --|--68536116696879--|--18.00--|-- 2015-05-23--|--Multiple--|
|--5433126--|-- 2015-05-23 --|-- tlp05 --|--68435132139899--|-- 7.00--|-- 2015-05-29--|--Multiple--|
|--9865313--|-- 2015-06-01 --|-- zig15 --|--97889200016487--|--23.00--|-- 2015-06-15--|-- Once--|
|--7879463--|-- 2015-05-27 --|-- tlp10 --|-- NaN --|-- NaN --|-- NaN --|-- Never--|
...
什么是最有效的方法来实现这一点,而不是简单地遍历整个数据框,按用户 ID 拆分它并检查是否有任何购买?
请您参考如下方法:
您可以使用 GroupBy.transform 计算每组 purchase date 列的非缺失值数量和 sum 到 helper Series 并通过 numpy.select 设置新值:
s = df['purchase date'].notna().groupby(df['user id']).transform('sum')
df['activity'] = np.select([s == 0, s == 1], ['Never','Once'], default='Multiple')
print (df)
user id registration_date voucher campaign transaction id price \
0 5433126 2015-05-23 tlp05 6.853612e+13 18.0
1 5433126 2015-05-23 tlp05 6.843513e+13 7.0
2 9865313 2015-06-01 zig15 9.788920e+13 23.0
3 7879463 2015-05-27 tlp10 NaN NaN
purchase date activity
0 2015-05-23 Multiple
1 2015-05-29 Multiple
2 2015-06-15 Once
3 NaN Never
详细信息:
print (s)
0 2.0
1 2.0
2 1.0
3 0.0
Name: purchase date, dtype: float64
与Series.map 类似的想法按字典并用 Series.fillna 替换不匹配的缺失值:
df['activity'] = s.map({0:'Never', 1:'Once'}).fillna('Multiple')
print (df)
user id registration_date voucher campaign transaction id price \
0 5433126 2015-05-23 tlp05 6.853612e+13 18.0
1 5433126 2015-05-23 tlp05 6.843513e+13 7.0
2 9865313 2015-06-01 zig15 9.788920e+13 23.0
3 7879463 2015-05-27 tlp10 NaN NaN
purchase date activity
0 2015-05-23 Multiple
1 2015-05-29 Multiple
2 2015-06-15 Once
3 NaN Never
