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

pandas如何按日期分组分别统计分类列的各分类计数

按日期分性别统计人数的实现方案

需求说明

现有数据表包含两列:

  • Gender:人员性别,值为M/F
  • LastStart:人员开始日期
    需要按日期维度聚合,统计每个日期下男、女的人员数量,原始样例数据如下:
GenderLastStart
M2013-05-21
M2013-05-24
F2013-05-27
M2013-05-27
F2013-05-28
F2013-05-28

预期输出格式:

LastStartMF
2013-05-2110
2013-05-2410
2013-05-2711
2013-05-2802

之前尝试多列groupby后调用pivot失败,因为groupby聚合后返回的是Series类型,没有pivot方法。

可行实现方法

方法1:直接用crosstab一步生成(最简便)

pd.crosstab是pandas专门用于生成分组频数表的函数,不需要额外做聚合、转置操作,直接传入行、列维度即可,自动补全缺失分类的计数为0:

import pandas as pd

# 构造/读取原始数据
df = pd.DataFrame({
    'Gender': ['M','M','F','M','F','F'],
    'LastStart': ['2013-05-21','2013-05-24','2013-05-27','2013-05-27','2013-05-28','2013-05-28']
})
# 建议先把LastStart转为日期类型,避免字符串排序/格式问题
df['LastStart'] = pd.to_datetime(df['LastStart']).dt.date

# 直接生成统计结果
result = pd.crosstab(index=df['LastStart'], columns=df['Gender'])

运行后result的输出和预期完全一致。

方法2:groupby聚合后用unstack转置(适配原有思路)

多列groupby计数后返回的是多层索引的Series,不需要转成DataFrame再pivot,直接调用unstack把性别维度的行索引转成列即可,通过fill_value=0把无记录的性别计数填充为0:

result = df.groupby(['LastStart', 'Gender']).size().unstack(fill_value=0)

注意:这里聚合要用size()而不是count(),count()会排除空值,size()统计所有分组的记录数,更符合计数需求。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:09:15