Pandas 数据框中的变量 运行 总数

Variable Running Total in Pandas dataframe

我正在尝试在 python 中创建一个函数,用户在其中输入一列有意义的完整值和一个数字,将其称为 X。然后该函数将在 X 上创建一个 运行 总数那些意味着全部价值超过。

例如,对于系列 A,且 X = 3:

import random 
mylist = []
for i in range(0,100):
    x = random.randint(1,10)
    mylist.append(x)
a = pd.Series(mylist)
a.head()
Out:
 0    2
 1    5
 2    2
 3    8
 4    8
 5    6

所以 my_func() 会 return 这个新序列(作为第三列):

 0    2   Nan
 1    5   Nan
 2    2   9 # 2+5+2
 3    8   15 # 5+2+8
 4    8   18 # 2+8+8
 5    6   22 # 8+8+6

我想过以某种方式使用 cumsum(),但无法理解其中的 X 部分。老实说,我不知道从哪里开始。

您可以使用 rolling sum 并指定 window(在您的情况下为 3)。 像这样的一些会起作用:

In [348]: df                                                                                                                                                                                                
Out[348]: 
0  2
1  5
2  2
3  8
4  8
5  6

In [350]: df.rolling(window=3).sum()                                                                                                                                                                     
Out[350]: 
0     NaN
1     NaN
2     9.0
3    15.0
4    18.0
5    22.0
Name: A, dtype: float64

数据

df=pd.read_clipboard()
df

Rolling sum

df['runningsum']=df.rolling(3).s.sum()
df

输出

不确定您是在研究更优化的 Pandas 还是 Numpy 解决方案,但为了完整起见,我在这里建议使用纯 python 版本的函数。它实现了一个生成器,因此在许多情况下,它可能是一个非常简单但高性能的选项,没有任何外部依赖:


def my_func2(data, x):
    i = 1
    for n in data:
        if i < x:
            yield 0  # ignore the first numbers
        else:       
            yield sum(data[i-x:i]) # sum the current number and previous x-1 numbers.
        i += 1



mylist = [2, 5, 2, 8, 8, 6]

# The enumerate() part is just a way to generate the counting on the left
for i, n in enumerate(my_func2(mylist, 3)):
    print(f"{i:5}: {n:9}")