2015-12-27 4 views
5

Ho un dataframe panda con 2 colonne in questo modo:Calcolo vettorializzato del valore di una colonna in base a un valore precedente della stessa colonna?

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 

voglio creare una nuova colonna C nel modo seguente: C [i] = C [i-1] -A [i] + B [i]

In questo question la risposta propone l'uso di un ciclo come questo:

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 

che fa il lavoro.

Ma poiché i cicli sono generalmente lenti rispetto ai calcoli vettorizzati, mi chiedevo se esiste una soluzione vettoriale per questo nei panda. (E questa è la ragione di questa nuova domanda).

ho cercato di utilizzare il metodo di spostamento come questo

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

ma non ha aiutato dal momento che la colonna C spostato non viene aggiornato con il calcolo. Mantiene i valori originali:

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

e che produce un risultato errato.

risposta

6

Il problema che si può essere vettorizzato dal delta [i] = C [i] - C [i-1] = -A [i] + B [i]. È possibile ottenere prima il delta da A e B e calcolare la somma cumulativa del delta (più C [0]) per ottenere C completo, come segue:

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

Grazie @ Happy001 funziona perfettamente. È anche una lezione utile per il futuro: se sei bloccato, fai qualche algebra e ripensa il tuo problema. – dimyG