如何对多分组Pandas DataFrame重采样,使各组合日期数一致?
解决Pandas日期范围补0计数问题
实现步骤
统一日期字段格式
先把原始DataFrame的date列转为datetime类型,避免后续日期处理出错:import pandas as pd # 假设原始数据框名为df df['date'] = pd.to_datetime(df['date'])生成完整日期序列
按照需求生成2020-01-01到2020-01-05的全部日期:full_dates = pd.date_range(start='2020-01-01', end='2020-01-05', freq='D')生成全量组合(笛卡尔积)
提取person_id、event、mode的唯一组合,再和完整日期序列做笛卡尔积,得到所有应存在的(date, person_id, event, mode)组合:# 获取唯一的(person_id, event, mode)分组 unique_groups = df[['person_id', 'event', 'mode']].drop_duplicates() # 生成笛卡尔积补全所有日期-分组组合 full_combinations = unique_groups.assign(key=1).merge(pd.DataFrame({'date': full_dates, 'key': 1}), on='key').drop('key', axis=1)统计原始数据的每日计数
对原始数据按person_id、event、mode、date分组,统计每组的记录条数:daily_counts = df.groupby(['person_id', 'event', 'mode', 'date']).size().reset_index(name='count')合并补0
将全量组合数据和统计结果左连接,把缺失的计数填充为0:df_summarized = full_combinations.merge(daily_counts, on=['person_id', 'event', 'mode', 'date'], how='left').fillna({'count': 0})
验证结果
运行你指定的验证代码,确认每个(person_id, event, mode)组合的唯一日期数均为5:
validation = df_summarized.groupby(['person_id', 'event', 'mode'])['date'].nunique().reset_index() # 输出查看结果,所有nunique值应为5 print(validation)
内容的提问来源于stack exchange,提问作者Dr Wampa
相关产品推荐
相关产品推荐

