基于分组重采样数据并计算滚动求和,求无循环新增DataFrame列方案
解决方案:无循环为DataFrame添加滚动求和列
针对你的需求——无需循环,从DataFrame末尾开始提取每第n行并计算前x个的滚动求和,我们可以利用pandas的索引切片和滚动计算功能来实现,全程无需手动循环。
步骤1:构建示例DataFrame
首先把你提供的样本数据转换成pandas DataFrame:
import pandas as pd import numpy as np # 你的样本数据 data = { 'date': ['8/30/2019', '9/6/2019', '9/13/2019', '9/20/2019', '9/27/2019', '10/4/2019', '10/11/2019', '10/18/2019', '10/25/2019', '11/1/2019', '11/8/2019', '11/15/2019', '11/22/2019'], 'value': [2, 4, 1, 2, 3, 3, 5, 5, 7, 4, 9, 6, 5] } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date'])
步骤2:提取从末尾开始的每第n行
我们需要先定位到所有从DataFrame末尾开始的第n行(这里n=5)。可以通过索引反转+切片的方式快速获取这些行的索引:
n = 5 # 反转索引,每n个取一个,再反转回来得到原顺序的目标索引 target_indices = df.index[::-1][::n][::-1]
这一步会得到从前往后数,每间隔n-1行的索引(从末尾开始算的第n行),对应你样本里的9/13/2019、10/18/2019、11/22/2019这几行。
步骤3:计算前x个数值的滚动求和
接下来提取这些行的value值,并用rolling()函数计算前x=2个的滚动求和:
x = 2 # 提取目标行的value selected_values = df.loc[target_indices, 'value'] # 计算滚动求和,设置min_periods=1可以保留第一个值(如果不需要可去掉,第一个值会是NaN) rolling_sums = selected_values.rolling(window=x, min_periods=1).sum()
步骤4:将结果映射回原DataFrame
最后新建一列,把滚动求和的结果赋值到对应的行,其他行填充NaN:
df['rolling_sum'] = np.nan df.loc[rolling_sums.index, 'rolling_sum'] = rolling_sums
适配你的示例结果
如果你的实际需求是对每个行,取它和它往前数第k行的value求和(对应你给出的示例结果),那可以直接用shift()函数实现,更简洁:
# 这里k根据你的示例结果调整,比如对应11/22的5+7=12,k=3 k = 3 df['rolling_sum'] = df['value'] + df['value'].shift(k)
内容的提问来源于stack exchange,提问作者qfd
相关产品推荐
相关产品推荐

