2016-12-22 9 views
1

Ich versuche, eine einfache Funktion auf einen Pandas Datenrahmen anzuwenden. Ich möchte eine Variable erreichen von der Formel in „my_res“, die so genannte „Ziel“, und fügen Sie es zu dem Datenrahmenanwenden Funktion Pandas Datenrahmen

import pandas as pd 
df = pd.DataFrame({'ID':['1','2','3'], 'v1': [0,2,3], 'v2':[1,4,5], 'v3':[11,43,52]}) 
print df 


def my_res (x,y,z): 
    target=(x*z)/y 
    return target 


df['target'] = df.apply(my_res('v1','v2','v3'),axis=1) 
print df 

und was passiert, wenn ich eine Formel wie folgt hatte:

def my_res (x,y,z): 
    target=(x*z)/y 
    check=target-z 
    return target 

#in this case I want to create 2 variable in the df 

Antwort

1

Sie können lambda mit Spaltennamen verwenden:

df['target'] = df.apply(lambda x: my_res(x.v1,x.v2,x.v3),axis=1) 
print (df) 
    ID v1 v2 v3 target 
0 1 0 1 11  0.0 
1 2 2 4 43 21.5 
2 3 3 5 52 31.2 

Aber besser und schneller wird vektorisiert Lösungen verwenden, um mit mul, div und sub :

df['target'] = df.v1 * df.v3 /df.v2 
print (df) 
    ID v1 v2 v3 target 
0 1 0 1 11  0.0 
1 2 2 4 43 21.5 
2 3 3 5 52 31.2 

df['target'] = df.v1.mul(df.v3).div(df.v2) 
print (df) 
    ID v1 v2 v3 target 
0 1 0 1 11  0.0 
1 2 2 4 43 21.5 
2 3 3 5 52 31.2 

Timings:

def my_res (x,y,z): 
    target=(x*z)/y 
    return target 

#[30000 rows x 4 columns]  
df = pd.concat([df]*10000).reset_index(drop=True) 
df['target'] = df.v1.mul(df.v3).div(df.v2) 
df['target1'] = df.apply(lambda x: my_res(x.v1,x.v2,x.v3),axis=1) 
print (df) 

In [290]: %timeit df.v1.mul(df.v3).div(df.v2) 
1000 loops, best of 3: 305 µs per loop 

In [291]: %timeit df.apply(lambda x: my_res(x.v1,x.v2,x.v3),axis=1) 
1 loop, best of 3: 1.66 s per loop 

In [292]: %timeit df.v1 * df.v3/df.v2 
1000 loops, best of 3: 562 µs per loop 
+0

Dank, habe ich eine Verallgemeinerung Detail auf meine Frage – progster

+0

Sicher, können Sie 'df [ 'Ziel'] verwenden = df.v1.mul (df.v3) .div (df.v2) .sub (df.v3) ' ' df ['Ziel'] = df.v1 * df.v3 /df.v2 - df.v3'. 'apply'-Lösung wird verwendet, wenn ein vektorisierter Ansatz unmöglich ist. – jezrael

0

Es gibt keinen Grund, hier zu verwenden, gelten. Eine einfache vektorisierte Operation wird funktionieren.

df.v1 * df.v3/df.v2 
Verwandte Themen