Добавление столбца на основе группового - PullRequest
0 голосов
/ 26 января 2019

Достигнув конца анализа, у меня есть один фрейм данных (в этом примере df_delta), содержащий идентификатор, группу, базовую линию, происхождение, впоследствии_ события и дельта_монта.

Мой подход: объединять, объединять или объединять с последующими событиями (df_a_b), а затем суммировать (concat, показанный во фрагменте) на основе идентификатора.

import pandas as pd
data_a = {
'id': [3, 2, 1, 0]
,'group':['test','test','control','control']
,'original_event_date': ['2018-01-02', '2018-02-01', '2018-03-20', '2018-01-01']
,'baseline':['100', '20', '1000', '5']
}
df_a = pd.DataFrame.from_dict(data_a)

data_b = {
'id': [3,3,3,3, 1, 0,0]
,'subsequent_event_date': ['2018-02-02','2018-03-02','2018-04-02', '2018-01-15','2018-03-13', '2018-03-20', '2018-04-01']
,'subsequent_events':['3','5','7','2','20', '10', '5']
}
df_b = pd.DataFrame.from_dict(data_b)

#assign original event month to each record [id]
df_a['origination'] = pd.to_datetime(df_a['original_event_date']).dt.strftime('%Y-%m')

#sum subsequent events by record [id]                
df_sum_b = df_b.groupby(by=("id"))["subsequent_events"].sum()

#join the two to get delta_month
df_a_b = pd.concat([df_a, df_b], axis=1, sort=False) 

df_delta = pd.merge(df_a,df_b,how='left',on='id')
df_delta['delta_month'] = (pd.to_datetime(df_delta['subsequent_event_date']).dt.year - pd.to_datetime(df_delta['original_event_date']).dt.year) * 12 \
                    + (pd.to_datetime(df_delta['subsequent_event_date']).dt.month - pd.to_datetime(df_delta['original_event_date']).dt.month)

df_delta = df_delta.drop(columns=['original_event_date','subsequent_event_date']).fillna(0)

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

Похоже, что объединение, объединение и объединение не имеют такой функциональности. Если каждое исходное событие связано с последующим событием, исходные значения события, в которых не было никаких последующих событий, теряются, и если последующие события и исходные события суммируются в одном действии, будет кратно исходному событию, соответствующему delta_month.

У кого-нибудь есть лучшие предложения о том, как подойти к этому по-другому?

1 Ответ

0 голосов
/ 31 января 2019

Я бы добавил как можно больше к разгруппированным кадрам (личные предпочтения), поэтому использование transform хорошо.

исходные значения событий, в которых не было последующих событий, теряются

Это можно решить с помощью fillna. Так как похоже, что вы хотите суммировать subsequent_events численно, мы могли бы с нуля разыграть целые числа (или числа с плавающей запятой или ...).

df_delta['subsequent_events'] = df_delta['subsequent_events'].fillna('0').astype(int)
df_delta['sum_events_in_month'] = df_delta.groupby(['group','origination','delta_month'])['subsequent_events'].transform('sum').fillna(0)
df_delta['delta_month'].fillna(0, inplace=True)
df_sum_b = df_delta.groupby(['group','origination','delta_month'])[['baseline', 'sum_events_in_month']].apply(lambda x: x.astype(int).sum())

df_sum_b['pct'] = df_sum_b['sum_events_in_month']/df_sum_b['baseline']

(Правка: предлагаемое правка указала на недостаток, хотя я не думаю, что решение сработало; вместо .astype(int).fillna(0), который ломается, поскольку пропущенные значения не могут быть приведены к целому числу, я поменял порядок на .fillna('0').astype(int). Согласно комментарию, я добавил еще fillna с, которые, кажется, делают свое дело.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...