Skip to main content
 首页 » 编程设计

python之获取用户列表以及他们从数据框中购买了多少

2025年05月04日18wayfarer

我有一个包含如下用户数据的数据框:

|--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