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
相关产品推荐
相关产品推荐

