Переменная Итоговая сумма в Pandas кадре данных - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать функцию в 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_fun c () вернет этот новый 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-части. И, честно говоря, я не знал, с чего начать.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2020

Вы можете использовать скользящую сумму и указать окно (в вашем случае 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
1 голос
/ 07 апреля 2020

Данные

df=pd.read_clipboard()
df

enter image description here

Скользящая сумма

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

Выход

enter image description here

0 голосов
/ 07 апреля 2020

Не уверен, что вы ищете более оптимизированное Pandas или Numpy решение, но для полноты картины я предлагаю здесь чисто -1005 * версию функции. Он реализует генератор, так что во многих случаях это может быть довольно простой, но производительный вариант, без каких-либо внешних зависимостей:


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}")

...