You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:30:03