2016-12-22 10 views
1

私はパンダのデータフレームに単純な関数を適用しようとしています。私は「my_res」で定義された式から、「ターゲット」と呼ばれる変数を達成したい、と私はこのような式があった場合のデータフレームapply function pandas dataframe

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 

と何にそれを追加します。

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 

答えて

1

muldivsubでベクトル化ソリューションを使用している

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 

しかし、より良く、より速く:あなたは、列名とlambdaを使用することができます:

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 

タイミング

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

おかげで、私は私の質問に汎化ディテールを追加 – progster

+0

確かに、あなたは(df.v3).div(df.v2).SUB( 'DF [ '目標'] = df.v1.mulを使用することができますdf.v3) ' ' df ['target'] = df.v1 * df.v3 /df.v2 - df.v3'です。ベクトル化アプローチが不可能な場合には 'apply'解法が使用されます。 – jezrael

0

ここに適用されます使用する理由はありません。単純なベクトル化演算が機能します。

df.v1 * df.v3/df.v2