Pandas数据框中的可变运行总计

我正在尝试在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()将返回这个新的Sereis(作为第三列):

 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部分包裹起来时遇到了麻烦。老实说,我不知道从哪里开始。

mihui1234 回答:Pandas数据框中的可变运行总计

您可以使用rolling sum并指定窗口(在您的情况下为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

enter image description here

Rolling sum

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

输出

enter image description here

,

不知道您是否正在寻找更优化的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,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}")

本文链接:https://www.f2er.com/2498384.html

大家都在问