2015-12-27 30 views
5

mam dataframe pandas z 2 kolumn tak:Wektoryzowane obliczanie wartości kolumny na podstawie poprzedniej wartości tej samej kolumny?

df = pd.DataFrame(data={'A': [10, 2, 3, 4, 5, 6], 'B': [0, 1, 2, 3, 4, 5]}) 
>>> df 
    A B 
0 10 0 
1 2 1 
2 3 2 
3 4 3 
4 5 4 
5 6 5 

że ma tworzyć nową kolumnę C w następujący sposób: C [i] = C [i-1] -A [j] + B [i]

W tym question na zadane proponuje zastosowanie pętli tak:

df['C'] = df['A'] 

for i in range(1, len(df)): 
    df['C'][i] = df['C'][i-1] - df['A'][i] + df['B'][i] 

>>> df 
    A B C 
0 10 0 10 
1 2 1 9 
2 3 2 8 
3 4 3 7 
4 5 4 6 
5 6 5 5 

który wykonuje pracę.

Ale ponieważ pętle są generalnie powolne w porównaniu do obliczeń wektorowych, Zastanawiam się, czy istnieje wektoryzowane rozwiązanie tego w pandach. (I to jest powód tego nowego pytania).

Próbowałem użyć metody shift jak ten

df['C'] = df['C'].shift(1).fillna(df['A']) - df['A'] + df['B'] 

ale to nie pomogło, ponieważ przesunięty kolumna C nie jest na bieżąco z obliczeń. Zachowuje swoje oryginalne wartości:

>>> df['C'].shift(1).fillna(df['A']) 
0 10 
1 10 
2  2 
3  3 
4  4 
5  5 

i daje niepoprawny wynik.

Odpowiedz

6

Twój problem może być wektoryzowany od delta [i] = C [i] - C [i-1] = -A [i] + B [i]. Najpierw można uzyskać deltę od A i B i obliczyć skumulowaną sumę delty (plus C [0]), aby uzyskać pełne C, jak następuje:

In [21]: 
delta = df['B'] - df['A'] 
delta[0] = 0 
df['C'] = df.loc[0, 'A'] + delta.cumsum() 
​ 
print df 
    A B C 
0 10 0 10 
1 2 1 9 
2 3 2 8 
3 4 3 7 
4 5 4 6 
5 6 5 5 
+0

Dzięki @ Happy001 działa idealnie. Jest to również przydatna lekcja na przyszłość: jeśli utkniesz, zrób trochę algebry i przemyśl swój problem. – dimyG

Powiązane problemy