在一些分析结束时,我有一个单独的数据帧(示例中的df琰delta),包含id、group、baseline、origination、后续的琰u事件和delta琰u month。你知道吗
我的方法是:与后续事件(df\u a\u b)合并、连接或连接,然后基于id求和(代码段中显示的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)
理想的输出将包括:测试/控制、原始事件的yyyy-mm、delta\u-month作为组以及每个delta\u-month的基线总和百分比。你知道吗
Join、merge和concat似乎没有这个功能。如果每个原始事件都与一个后续事件相关联,则没有发生后续事件的原始事件值将丢失,并且如果在同一操作中对后续事件和原始事件进行求和,则会有与delta_月对应的原始事件的倍数
有没有人对如何以不同的方式处理这个问题有更好的建议?你知道吗
我会尽可能多地添加到未分组的帧中(个人偏好),因此使用
transform
很好。你知道吗可以通过
fillna
来解决。因为它看起来像是要对subsequent_events
进行数值求和,所以我们不妨从一开始就将其转换为整数(或浮点或…)。你知道吗(编辑:建议的编辑确实指出了一个缺陷,尽管我认为解决方案不起作用;而不是
.astype(int).fillna(0)
,因为缺少的值不能是整数强制转换,所以会中断,我将顺序改为.fillna('0').astype(int)
。根据评论,我添加了更多的fillna
似乎可以达到目的。)相关问题 更多 >
编程相关推荐