如何在pandas中实现多个日期列的数据聚合统计
解决方案
你可以先将原宽表转为长格式,再分组统计后转回目标宽表格式,具体实现代码如下:
# 1. 转换为长格式,过滤掉未接种的空日期记录 melted = df.melt(id_vars='name', value_vars=['vaccine_1', 'vaccine_2'], var_name='vaccine_type', value_name='date').dropna(subset=['date']) # 2. 按日期和疫苗剂次分组统计人数,再转为目标宽表结构 result = melted.groupby(['date', 'vaccine_type'])['name'].count()\ .unstack(fill_value=0)\ .rename(columns={'vaccine_1':'vaccine_1_total', 'vaccine_2':'vaccine_2_total'})\ .reset_index() print(result)
如果偏好单独统计再合并的逻辑,也可以用如下简化写法:
# 分别统计两剂疫苗的每日接种量 v1_count = df.groupby('vaccine_1')['name'].count().rename('vaccine_1_total') v2_count = df.groupby('vaccine_2')['name'].count().rename('vaccine_2_total') # 按日期对齐合并两个统计结果,缺失值填充为0 result = pd.concat([v1_count, v2_count], axis=1).fillna(0).reset_index(names='date')
输出结果示例
| date | vaccine_1_total | vaccine_2_total | |
|---|---|---|---|
| 0 | 2021-01-20 | 2 | 0 |
| 1 | 2021-02-20 | 1 | 0 |
| 2 | 2021-02-22 | 1 | 2 |
| 3 | 2021-02-23 | 1 | 0 |
| 4 | 2021-02-25 | 0 | 1 |
| 5 | 2021-03-22 | 0 | 1 |
内容的提问来源于stack exchange,提问作者catris25
相关产品推荐
相关产品推荐

