如何在pandas中聚合多列生成含性别、疫苗类型维度的统计表格
核心问题是你之前调用melt方法时仅保留了针次和日期字段,丢失了后续分组需要的gender、vaccine_type维度字段,因此无法做多维度的聚合统计。你可以参考如下代码实现需求:
import pandas as pd import numpy as np # 你的原始数据构造逻辑 df = pd.DataFrame(data={'name':['a', 'b', 'c', 'd', 'e', 'f'], 'vaccine_1':['2021-01-20', '2021-01-20', '2021-02-20', np.nan, '2021-02-22', '2021-02-23'], 'vaccine_2':['2021-02-22', '2021-02-22', '2021-02-25', np.nan, '2021-03-22', np.nan], 'vaccine_type': ['AZ', 'AZ', 'AZ', np.nan, 'Sinovac', 'Sinovac'], 'gender':['F', 'M', 'F', 'F', 'M', 'M']}) df['vaccine_1'] = pd.to_datetime(df['vaccine_1']).dt.date df['vaccine_2'] = pd.to_datetime(df['vaccine_2']).dt.date # === 核心处理逻辑 === # 1. 长宽转换时保留分组维度,删除空值行 melted = df.melt( id_vars=['gender', 'vaccine_type'], value_vars=['vaccine_1', 'vaccine_2'], var_name='vaccine_round', value_name='date' ).dropna(subset=['date', 'vaccine_type']) # 2. 按日期、疫苗类型分组,分别统计不同性别人数、各针次接种总量 result = melted.groupby(['date', 'vaccine_type'], as_index=False).agg( F = ('gender', lambda x: (x == 'F').sum()), M = ('gender', lambda x: (x == 'M').sum()), vaccine_1_total = ('vaccine_round', lambda x: (x == 'vaccine_1').sum()), vaccine_2_total = ('vaccine_round', lambda x: (x == 'vaccine_2').sum()) ).sort_values('date').reset_index(drop=True) print(result)
运行上述代码得到的输出结构和你需求的完全一致,如果后续需要新增统计维度,只需在groupby的第一个参数列表中添加对应字段即可。
内容的提问来源于stack exchange,提问作者catris25
相关产品推荐
相关产品推荐

