лучший способ использовать групповые или совокупные в пандах - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть таблица с именами клиентов, и я хочу показать, сколько раз кто-то регистрировал или покупал элемент на основе идентификатора пользователя.

Цель состоит в том, чтобы получить таблицу, в которой будет отображаться сумма значения registration_complete и покупки на основена ID пользователя

Это код, который я написал.К сожалению, не все столбцы отображаются

  new_file= new_data.groupby(['userid']) 
  ['Registration_Complete','Purchase'].agg('sum')
  new_file.head(5)

Это таблица, которую я использую для определения регистрации и покупки на основе идентификатора пользователя

 Event_day  timestamp        install  userid  registration   purchase
 1/1/1900   1/1/1900 16:10    yes     555221     1               0
 1/1/1900   1/1/1900 16:12    yes     555221     1               1
 2/19/2010  1/19/2010 16:40   no      533211     0               1
 2/19/2010  1/19/2016 16:53   yes     533211     0               1
 2/20/2017  2/20/2017 15:46   yes     53200      1               0
 3/15/2017  3/15/2018 15:48   yes     53200      1               0
 3/15/2017  3/15/2018 20:14   yes     53200      1               0

, и я хочу что-то, что даст мнесумма

Event_day  timestamp        install  userid  registration   purchase
1/1/1900   1/1/1900 16:10    yes     555221     2               0
2/19/2010  1/19/2016 16:53   yes     533211     0               2
3/15/2017  3/15/2018 20:14   yes     53200      5               0

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

IIUC вы можете оставить значение first или last для других столбцов, передавая диктант на agg

agg = {'Event_day': 'last', 'timestamp': 'last', 'install': 'last', 'registration': 'sum', 'purchase': 'sum'}
df.groupby('userid').agg(agg).reset_index()

    userid  Event_day   timestamp       install registration    purchase
0   53200   3/15/2017   3/15/2018 20:14 yes     3               0
1   533211  2/19/2010   1/19/2016 16:53 yes     0               2
2   555221  1/1/1900    1/1/1900 16:12  yes     2               1

Редактировать:

Учитывая, чтонекоторые ответы, возможно, являются правильными, мне интересно сделать тест производительности между ними

Время

dfg1 = df.groupby("userid")["install", "timestamp", "Event_day"].max()
dfg2 = df.groupby("userid").sum()
pd.concat([dfg1, dfg2], axis=1)

38,5 мс ± 393 мкс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 10 циклов в каждом)

first_other_columns = df[['Event_day', 'timestamp', 'install',  'userid']].drop_duplicates(['userid'], keep='first')
grouped = df.groupby(['userid']).sum().reset_index()
pd.merge(grouped, first_other_columns, on=['userid'])

11,3 мс ± 100 мкс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 100 циклов в каждом)

agg = {'Event_day': 'last', 'timestamp': 'last', 'install': 'last', 'registration': 'sum', 'purchase': 'sum'}
df.groupby('userid').agg(agg).reset_index()

6,85 мс ± 62,5 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов каждый)

0 голосов
/ 29 апреля 2019

Что вы хотите, чтобы произошло с другими столбцами данных?Что-то вроде этого, кажется, приближается к тому, что вы хотите, получая максимум других столбцов.

dfg1 = df.groupby("userid")["Event_day", "timestamp", "install"].max()
dfg2 = df.groupby("userid").sum()
pd.concat([dfg1, dfg2], axis=1)

Выход

        Event_day timestamp install  registration  purchase
userid                                                     
53200   3/15/2018     20:14     yes             3         0
533211  1/19/2016     16:53     yes             0         2
555221   1/1/1900     16:12     yes             2         1



0 голосов
/ 29 апреля 2019

Вы можете использовать следующее:

import pandas as pd

first_other_columns = new_file[['Event_day', 'timestamp', 'install',  'userid']].drop_duplicates(['userid'], keep='first')
grouped = new_file.groupby(['userid']).sum().reset_index()
grouped = pd.merge(grouped, first_other_columns, on=['userid'])

Это позволит вам сохранить первую метку времени, событие_день, установить и сгруппировать идентификатор пользователя.

Дайте мне знать!Я надеюсь, что это помогает.BR

...