2015-11-04 19 views
6

Sono nuovo di Python e non sono sicuro di come risolvere il seguente problema.Come applicare una funzione su ogni riga di un dataframe?

Ho una funzione:

def EOQ(D,p,ck,ch): 
    Q = math.sqrt((2*D*ck)/(ch*p)) 
    return Q 

Dire che ho il dataframe

df = pd.DataFrame({"D": [10,20,30], "p": [20, 30, 10]}) 

    D p 
0 10 20 
1 20 30 
2 30 10 

ch=0.2 
ck=5 

E ch e ck sono tipi float. Ora voglio applicare la formula a ogni riga del dataframe e restituirla come una riga aggiuntiva "Q". Un esempio (che non funziona) sarebbe:

df['Q']= map(lambda p, D: EOQ(D,p,ck,ch),df['p'], df['D']) 

(ritorni soltanto 'CARTA' tipi)

avrò bisogno di questo tipo di lavorazione più nel mio progetto e spero di trovare qualcosa che funziona.

+0

È possibile guardare attraverso questa funzione che si applica alle righe funzioni: docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html – Litwos

risposta

7

Come io non so che cosa è PartMaster, il seguente dovrebbe funzionare:

def EOQ(D,p,ck,ch): 
    p,D = Partmaster 
    Q = math.sqrt((2*D*ck)/(ch*p)) 
    return Q 
ch=0.2 
ck=5 
df['Q'] = df.apply(lambda row: EOQ(row['D'], row['p'], ck, ch), axis=1) 
df 

Se tutto quello che stai facendo è il calcolo della radice quadrata di qualche risultato quindi utilizzare il metodo np.sqrt questo è Vectorised e volontà essere significativamente più veloce:

In [80]: 
df['Q'] = np.sqrt((2*df['D']*ck)/(ch*df['p'])) 

df 
Out[80]: 
    D p   Q 
0 10 20 5.000000 
1 20 30 5.773503 
2 30 10 12.247449 

Tempi

F o un df 30k consecutive:

In [92]: 

import math 
ch=0.2 
ck=5 
def EOQ(D,p,ck,ch): 
    Q = math.sqrt((2*D*ck)/(ch*p)) 
    return Q 

%timeit np.sqrt((2*df['D']*ck)/(ch*df['p'])) 
%timeit df.apply(lambda row: EOQ(row['D'], row['p'], ck, ch), axis=1) 
1000 loops, best of 3: 622 µs per loop 
1 loops, best of 3: 1.19 s per loop 

Si può vedere che il metodo è np ~ 1900 x più veloce

+0

Ci scusiamo per l'Partmaster, quello era un codice per provare un'altra funzione, l'ho cancellato per chiarezza – Koen

+0

Ho lavorato perfettamente grazie mille! – Koen

+0

Consiglio vivamente di guardare le funzioni di Numpy per qualsiasi cosa tu stia tentando di fare in modo che tu operi sull'intera df piuttosto che sulla riga – EdChum

0

Sono d'accordo con la risposta di EdChum. Un approccio più generale sarebbe:

def RowWiseOperation(x): 
    if x.ExistingColumn1 in x.ExistingColumn.split(','): 
     return value1 
    else: 
     return value2 

YourDataFrame['NewColumn'] = YourDataFrame.apply(RowWiseOperation, axis = 1) 
Problemi correlati