Векторизация циклов в питоне - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий код в Python:

import numpy as np
import pandas as pd
colum1 = [1,2,3,4,5,6,7,8,9,10,11,12]
colum2 = [10,20,30,40,50,60,70,80,90,100,110,120]

df = pd.DataFrame({
    'colum1' : colum1,
    'colum2' : colum2
});

df.loc[df.colum1 == 1,'result'] = df['colum2']

for i in range(len(colum2)):
    df.result = np.where(df.colum1>1, 5 - (df['colum2'] - df.result.shift(1)), df.result)

результат df.result:

    colum1  colum2  result
0        1      10    10.0
1        2      20    -5.0
2        3      30   -30.0
3        4      40   -65.0
4        5      50  -110.0
5        6      60  -165.0
6        7      70  -230.0
7        8      80  -305.0
8        9      90  -390.0
9       10     100  -485.0
10      11     110  -590.0
11      12     120  -705.0

Я хотел бы знать, если есть метод, который позволяет мнеполучить тот же результат без использования цикла для

1 Ответ

0 голосов
/ 11 октября 2018

Ваша операция зависит от двух вещей: предыдущей строки в DataFrame и разницы между последовательными значениями в DataFrame.Это намекает на то, что для решения потребуются shift и diff.Однако вы хотите добавить небольшую константу к расширяющейся сумме, а также фактически вычесть это из каждой строки, а не добавлять ее.


Чтобы установить части проблемы, сначала создайте свою сдвинутуюряд, в который вы добавляете 5:

a = df.colum2.shift().add(5).cumsum().fillna(0)

Теперь вам нужна разница между элементами в Серии, и заполните недостающие результаты их соответствующим значением в colum2:

b = df.colum2.diff().fillna(df.colum2)

Чтобы получить окончательный результат, просто вычтите a из b:

b - a

0      10.0
1      -5.0
2     -30.0
3     -65.0
4    -110.0
5    -165.0
6    -230.0
7    -305.0
8    -390.0
9    -485.0
10   -590.0
11   -705.0
Name: colum2, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...