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

