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

Python中如何按id分组月度聚合DataFrame并统计Value总和?

解决按ID和月度统计Value频次的问题

嘿,作为Python新手能想到用分组统计来处理这份日度数据,已经迈出很棒的一步啦!我来帮你一步步实现目标,把原始的日度DataFrame转换成按ID和月度统计a、b数量的df1。

第一步:先明确原始数据结构(模拟示例)

首先我先模拟一份和你描述一致的示例数据,方便你对照理解:

import pandas as pd

# 构造你的df示例:1月10天,id1和id2的日度Value数据
data = {
    'date': pd.date_range(start='2024-01-01', end='2024-01-10').repeat(2),
    'id': [1, 2]*10,
    'Value': ['a','b','a','a','b','b','a','b','a','a','b','b','a','a','b','b','a','b','a','b']
}
df = pd.DataFrame(data)

第二步:确保日期列是datetime类型(关键前提)

如果你的原始df里date列是字符串格式,得先转换成datetime类型,这样才能提取月份信息:

# 转换日期列(如果已经是datetime可以跳过这步)
df['date'] = pd.to_datetime(df['date'])

第三步:提取月度信息

我们可以给df新增一个month列,用周期类型(比如2024-01)来表示月份,这样分组更清晰:

df['month'] = df['date'].dt.to_period('M')

第四步:分组统计a和b的数量(两种常用方法)

这里给你两种简单易懂的实现方式,选你觉得顺手的就行:

方法一:groupby + value_counts + unstack

这种方法先分组,再统计每个组内Value的频次,最后把行转成列:

# 按id和month分组,统计Value的频次,转列后填充缺失值为0
df1 = df.groupby(['id', 'month'])['Value'].value_counts().unstack(fill_value=0).reset_index()

方法二:pivot_table(更直观的透视表方式)

透视表是pandas里做分组统计的利器,参数一目了然:

df1 = pd.pivot_table(df,
                     index=['id', 'month'],  # 行分组依据:id和月份
                     columns='Value',        # 列分组依据:Value的a和b
                     aggfunc='size',         # 统计方式:计数
                     fill_value=0).reset_index()  # 填充空值为0,把索引变回列

最终效果

运行完上面的代码后,df1就会是你想要的结果,大概长这样:

Value  id    month  a  b
0      1  2024-01  7  3
1      2  2024-01  3  7

简单解释下:这个结果展示了id1在2024年1月里,Value为a的有7天,b的有3天;id2则是a有3天,b有7天,完全符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:18