2016-01-18 7 views
16

Ho il seguente dataframe:C'è un modo in Pandas per utilizzare il valore di riga precedente in dataframe.apply quando viene calcolato anche il valore precedente nell'applica?

Index_Date A B C D 
=============================== 
2015-01-31 10 10 Nan 10 
2015-02-01  2 3 Nan 22 
2015-02-02 10 60 Nan 280 
2015-02-03 10 100 Nan 250 

Richiede:

Index_Date A B C D 
=============================== 
2015-01-31 10 10 10 10 
2015-02-01  2 3 23 22 
2015-02-02 10 60 290 280 
2015-02-03 10 100 3000 250 

Column C è derivato per 2015-01-31 prendendo value di D.

poi ho bisogno di usare il value di C per 2015-01-31 e moltiplicarlo per il value di A su 2015-02-01 e aggiungere B.

Ho tentato un apply e un shift utilizzando un if else da questo dà un errore chiave.

+0

Perché sono le tue ultime file in t I dataframes sono diversi per le colonne 'A' e' B'? –

+0

@Anton si scusa ora è corretto. – toasteez

+0

Qual è il valore della riga successiva nella colonna 'A' e colonna' D'? – jezrael

risposta

11

Innanzitutto creare il valore derivato:

df.loc[0, 'C'] = df.loc[0, 'D'] 

Poi iterazioni sulle rimanenti righe e riempire i valori calcolati:

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


    Index_Date A B C D 
0 2015-01-31 10 10 10 10 
1 2015-02-01 2 3 23 22 
2 2015-02-02 10 60 290 280 
+3

c'è una funzione in panda per fare questo senza il ciclo? – toasteez

+0

La natura iterativa del calcolo in cui gli input dipendono dai risultati dei passaggi precedenti complica la vettorizzazione. Potresti forse usare 'apply' con una funzione che fa lo stesso calcolo del loop, ma dietro le quinte questo sarebbe anche un loop. http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.apply.html – Stefan

+0

Se uso questo ciclo e calcoli su un dataframe unito e trova un Nan funziona ma solo alla fila con Nan. Nessun errore viene generato, Se provo un riempimentoNa ottengo AttributeError: l'oggetto 'numpy.float64' non ha attributo 'fillna' C'è un modo per saltare la riga con Nan o impostare i valori a zero? – toasteez

4

applicando la funzione ricorsiva sulle matrici NumPy sarà più veloce di quello attuale risposta.

df = pd.DataFrame(np.repeat(np.arange(2, 6),3).reshape(4,3), columns=['A', 'B', 'D']) 
new = [df.D.values[0]] 
for i in range(1, len(df.index)): 
    new.append(new[i-1]*df.A.values[i]+df.B.values[i]) 
df['C'] = new 

uscita

 A B D C 
    0 1 1 1 1 
    1 2 2 2 4 
    2 3 3 3 15 
    3 4 4 4 64 
    4 5 5 5 325 
+1

Questa risposta funziona perfettamente per me con un calcolo simile. Ho provato a utilizzare una combinazione di cumsum e shift, ma questa soluzione funziona molto meglio. Grazie. – Simon

3

Data una colonna di numeri:

lst = [] 
cols = ['A'] 
for a in range(100, 105): 
    lst.append([a]) 
df = pd.DataFrame(lst, columns=cols, index=range(5)) 
df 

    A 
0 100 
1 101 
2 102 
3 103 
4 104 

è possibile fare riferimento alla riga precedente, con spostamento:

df['Change'] = df.A - df.A.shift(1) 
df 

    A Change 
0 100 NaN 
1 101 1.0 
2 102 1.0 
3 103 1.0 
4 104 1.0 
Problemi correlati