Создание переменных на основе того, содержит ли столбец определенную строку во время групповой работы в пандах - PullRequest
0 голосов
/ 04 декабря 2018

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

account     site                        hitCount
243601      auth.svcs.facebook.com      3
243601      auth.svcs.facebook.com      1
243601      respframework.facebook.com  2
243601      respframework.facebook.com  1
243601      auth.svcs.facebook.com      6
243601      auth.svcs.facebook.com      2
243601      pie.prod.facebook.com       1
243601      profile.facebook.com        5
243601      respframework.facebook.com  4
243601      mediasearch.facebook.com    1
243601      pie.prod.facebook.com       2
243601      auth.svcs.facebook.com      1
243601      auth.svcs.facebook.com      1
243601      respframework.facebook.com  1
243601      profile.facebook.com        2
243601      auth.svcs.facebook.com      4
243601      collaborateext.facebook.com 1
243601      auth.svcs.facebook.com      1
243601      auth.svcs.facebook.com      2
243601      auth.svcs.facebook.com      4
243601      www.facebook.com            2

Образцы данных приведены для 1 клиента.Исходные данные имеют около 80 тыс. Клиентов.

Я делаю группу по каждому аккаунту, чтобы получить сумму количества обращений, как показано ниже:

df_hits.groupby(level = 0)['hitCount'].sum().reset_index()

Однако мне также нужно создатьЕще 3 переменные, как показано ниже:

account hitCount    profile_hit profile_hit_count   non_profile_hit_count
243601  47          1           2                   45
  • profile_hit - это двоичный флаг, показывающий, содержит ли сайт «профиль» или нет.
  • profile_hit_count - это количество обращений к учетной записи.сайт, содержащий данные (profile.facebook.com) в данных.
  • non_profile_hit_count является hitCOunt - profile_hit_count.

Я не уверен, как создавать другие переменные во время группировки по.Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 04 декабря 2018

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

#create new column for check string profile and cast to integers
df_hits =df_hits.assign(profile_hit_count=df_hits['site'].str.contains('profile').astype(int))
#aggregate `sum` twice - for profile_hit_count for count aocurencies
df = df_hits.groupby(level = 0).agg({'hitCount':'sum', 'profile_hit_count':'sum'})
#difference
df['non_profile_hit_count'] = df['hitCount'] - df['profile_hit_count']
#check if not 0 and cast to integer if necessary
df['profile_hit'] = df['profile_hit_count'].ne(0).astype(int)
print (df)
         hitCount  profile_hit_count  non_profile_hit_count  profile_hit
account                                                                 
243601         47                  2                     45            1
...