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

如何在DataFrame中基于as_of分组创建求和新列3months?

解决方案

情况1:每个as_of组的所有行共享同一个值,为该组最早3个date的value之和

按照你给出的示例,2017-02-24对应的3months值是该组最早三个日期的value总和,可通过以下代码实现:

import pandas as pd

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

# 按 as_of 分组,计算每组前3个日期的value之和
sum_3m = df.groupby('as_of').apply(
    lambda group: group.sort_values('date')['value'].head(3).sum()
).reset_index(name='3months')

# 将计算结果合并回原DataFrame
df = df.merge(sum_3m, on='as_of', how='left')

执行后,2017-02-24组的所有行的3months列值都会是 564.664 + 1232.714 + 1955.152 = 3752.53,完全匹配你的示例要求。


情况2:每行对应自身date之后3个可用date的value之和

如果需求是每行计算其后续三个日期的value总和,可使用以下代码:

import pandas as pd

# 转换日期列并按 as_of、date 排序
df['as_of'] = pd.to_datetime(df['as_of'])
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['as_of', 'date'])

# 计算每行后续3个value的和
df['3months'] = df.groupby('as_of')['value'].shift(-1) + df.groupby('as_of')['value'].shift(-2) + df.groupby('as_of')['value'].shift(-3)

# 或者用 rolling 更简洁的写法:
# df['3months'] = df.groupby('as_of')['value'].rolling(3).sum().shift(-3).reset_index(level=0, drop=True)

这种方式下,每行的3months值为自身日期之后连续三个日期的value相加,最后三行因没有足够的后续日期,会得到NaN。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:07:51