Как написать лямбда-функцию, которая подсчитывает уникальное количество клиентов с условием в другом столбце в функции pandas agg

#python #pandas #lambda #aggregate

Вопрос:

Я пытаюсь рассчитать меры по исходному кадру данных с некоторыми условиями. df-мой начальный фрейм данных. Вот меры, которые мне нужны в новом фрейме данных, но я не знаю, как продолжать группировку по столбцам:

 df['uniq_view_client'] = df[df['view'] == 1].groupby(['date_diff','platform','l2'])['user_client_id'].nunique()

df['uniq_click_client'] = df[df['click'] == 1].groupby(['date_diff','attributes_platform','l2'])['user_client_id'].nunique()
                
df['view'] = df.groupby(['date_diff','platform','l2'])['view'].sum()

df['click'] = df.groupby(['date_diff','platform','l2'])['click'].sum()
 

Я пытаюсь написать это таким образом, но понятия не имею, как посчитать один столбец и передать условие другому столбцу в функции agg pandas

 agg_mult_df= df.groupby(
     ['date_diff','platform','l2']
 ).agg(
     uniq_view_client=('clint_id','nunique')# pass a lambda function that counts unique number of clients only if views =1,
     uniq_click_client=('clint_id','nunique') #pass a lambda function that counts unique number of clients only if click =1,
     all_view= ('view',   'sum'),
     all_click= ('click',   'sum'),
 ).reset_index()
 

Кто-нибудь может помочь мне разобраться с лямбда-частью (я подумал, что это будет единственный вариант), пожалуйста?

вот пример начального df

и в результате df

результат df

Комментарии:

1. предоставление игрушечных данных и ожидаемых результатов приведет сообщество к наиболее эффективным ответам

Ответ №1:

Я не нашел никакого решения проблемы агрессивности панд, но мне удалось решить ее таким образом :

 df_test = df.groupby(['date_diff','platform','l2'], as_index=False).apply(lambda x: pd.Series({
        'a_sum'       : x['view'].sum(),
        'a_click'       : x['click'].sum(),
        'client_click'   : x[x['click'] == 1]['client_id'].nunique(),
        'client_view'   : x[x['view'] == 1]['client_id'].nunique()
    
     
  })
).reset_index(drop = True)
 

надеюсь, это кому-нибудь поможет)