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

Pandas分组计算:按年份分组求解每组的乘积转换值

Pandas按年份分组计算自定义复合指标

没问题,这个需求其实挺常见的,尤其是计算年度复合收益类指标的时候,我来一步步教你怎么实现:

第一步:准备数据并处理日期格式

首先得确保你的date列是datetime类型,不然没法正确提取年份。先构造你的DataFrame并转换日期:

import pandas as pd

# 构造你提供的DataFrame
df = pd.DataFrame({
    'value': [1.0, 0.3, 1.6, 2.5, -1.0, -0.3, 1.6],
    'date': ['2010-01-31', '2010-02-28', '2011-03-31', '2011-04-30', '2012-05-31', '2012-06-30', '2013-07-31']
})

# 将date列转换为datetime类型
df['date'] = pd.to_datetime(df['date'])

第二步:按年份分组并计算目标指标

你的公式[(1 + v1) * (1 + v2) * ... * (1 + vn) - 1] * 100,可以简化为((1+value列).乘积 -1)*100,我们可以用两种方式实现:

方式一:自定义聚合函数

先写一个函数封装你的计算逻辑,再用groupby.apply()调用:

def calculate_compound_metric(group):
    # 对每组的value加1后求乘积,减1再乘100
    return ((1 + group['value']).prod() - 1) * 100

# 按年份分组,应用自定义函数,最后重置索引得到清晰的结果
result = df.groupby(df['date'].dt.year).apply(calculate_compound_metric).reset_index(name='compound_result')

方式二:简洁的链式写法

如果不想写自定义函数,直接用agg()配合匿名函数更省事:

result = df.groupby(df['date'].dt.year)['value'].agg(
    lambda x: ((1 + x).prod() - 1) * 100
).reset_index(name='compound_result')

最终结果

运行上面的代码后,result会输出:

year  compound_result
0  2010            160.0
1  2011            810.0
2  2012           -100.0
3  2013            160.0

简单验证下:

  • 2010年:(1+1.0)*(1+0.3) = 2*1.3=2.6,(2.6-1)*100=160,正确
  • 2012年:(1-1.0)*(1-0.3)=0*0.7=0,(0-1)*100=-100,正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:31:50