получить список пользователей и сколько они купили с датафрейма - PullRequest
1 голос
/ 24 сентября 2019

У меня есть фрейм данных с пользовательскими данными, такими как:

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

Каков был бы наиболее эффективный способ добиться этого, не просто зацикливаясь на всем фрейме данных, разделяя его по идентификатору пользователя и проверяя, были ли какие-либо покупки?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Вы можете посчитать количество не пропущенных значений для групп столбцов purchase date с помощью GroupBy.transform и sum для вспомогательной серии и установить новые значения с помощью 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 
2 голосов
/ 24 сентября 2019

Еще одна попытка с использованием троичного:

import numpy as np

df["activity"] = np.where(pd.isnull(df['transactionid']), "Never", 
                          np.where(df.groupby('userid')['userid'].transform('count') > 1, 
                                   "Multiple", "Once")
                         )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...