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

如何用Python实现分组聚合后按不同月份数做除法运算

按ID分组计算总Value除以不同月份数

原始数据

id  date        value
1   2020-01-22  20
1   2020-03-12  18
1   2020-03-25  16
2   2020-04-22  20
2   2020-04-22  23

需求说明

  1. 先按id和date分组,对同一日期的value求和
  2. 再按id分组,将该ID下所有日期的求和后value总和,除以该ID对应的不同月份数量,得到最终结果

期望输出:

id  value_after_division
1   27
2   43

注:27=(20+18+16)/2,43=(43)/1

解决方案

方法一:分步实现

  1. 先完成第一步分组求和,得到中间结果并重置索引:
import pandas as pd

df = pd.DataFrame({
    'id': [1,1,1,2,2],
    'date': ['2020-01-22','2020-03-12','2020-03-25','2020-04-22','2020-04-22'],
    'value': [20,18,16,20,23]
})

# 第一步:按id和date分组求和
df_grouped = df.groupby(["id", "date"])["value"].sum().reset_index()
  1. 提取日期对应的月份周期,再按id分组计算总value和唯一月份数,最后做除法:
# 转换日期为月份周期(格式如2020-01)
df_grouped['month'] = pd.to_datetime(df_grouped['date']).dt.to_period('M')

# 按id分组计算总value和唯一月份数,再执行除法
result = df_grouped.groupby('id').apply(
    lambda x: x['value'].sum() / x['month'].nunique()
).reset_index(name='value_after_division')

print(result)

方法二:链式调用一步完成

将步骤合并,实现更简洁的代码:

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

result = (
    df.groupby(['id', 'date'])['value'].sum().reset_index()
    .groupby('id')
    .agg(
        total_value=('value', 'sum'),
        unique_months=('month', 'nunique')
    )
    .assign(value_after_division=lambda x: x['total_value'] / x['unique_months'])
    .drop(columns=['total_value', 'unique_months'])
    .reset_index()
)

print(result)

两种方法最终都会输出你期望的结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:24:15