#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
Комментарии:
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)
надеюсь, это кому-нибудь поможет)