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

Pandas按年月分组统计Desc各取值计数并转为列的实现方法

实现方法

你可以通过pandas的日期处理+交叉统计快速实现需求,步骤如下:

  • 首先修正样例数据里的无效日期:2022-04-31不存在(4月仅有30天),直接做日期解析会触发报错,实际使用时请替换为合法日期。
  • 将Date列转换为pandas原生datetime类型,提取年-月维度作为分组键。
  • 通过交叉表/分组聚合统计每个年月下不同Desc取值的出现次数,缺失计数填充为0,最后调整列顺序匹配期望格式即可。

完整代码示例

import pandas as pd

# 构造测试数据(已修正原数据中的无效4月31日为4月30日)
df = pd.DataFrame({
    'Date': [
        '2022-04-30', '2022-05-31', '2022-05-31', '2022-05-31', '2022-05-31',
        '2022-06-14', '2022-06-19', '2022-06-19', '2022-07-19', '2022-07-19'
    ],
    'Desc': ['Car', 'Bus', 'Car', 'Bike', 'Car', 'Car', 'Car', 'Bike', 'Bike', 'Bus']
})

# 转换日期格式,提取年-月分组维度
df['Date'] = pd.to_datetime(df['Date'])
df['ym'] = df['Date'].dt.strftime('%Y-%m')

# 方法1:用crosstab交叉表统计,填充缺失值为0
result = pd.crosstab(index=df['ym'], columns=df['Desc'], fill_value=0)
result = result.reset_index().rename(columns={'ym': 'Date'})
# 调整列顺序和期望输出一致
result = result[['Date', 'Car', 'Bus', 'Bike']]

运行后得到的result输出如下:

Date  Car  Bus  Bike
0  2022-04    1    0     0
1  2022-05    2    1     1
2  2022-06    2    0     1
3  2022-07    0    1     1

注:你给出的期望输出中2022-06的Bike计数为2,和提供的原始数据条目数不符,上述结果是按你给出的原始数据统计的正确值,如果你的实际数据有更多Bike条目,代码会自动统计对应数值。

如果你更习惯分组聚合写法,也可以替换统计部分的代码为groupby+unstack,效果完全一致:

# 方法2:分组聚合后行转列
result = df.groupby(['ym', 'Desc']).size().unstack(fill_value=0)
result = result.reset_index().rename(columns={'ym': 'Date'})
result = result[['Date', 'Car', 'Bus', 'Bike']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:27:23