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

