2016-12-22 24 views
1

我想将一个简单的函数应用于熊猫数据框。我想实现一个所谓的“目标”变量,从“my_res”定义的公式,并将其添加到数据帧应用功能熊猫数据帧

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

您可以使用lambda列名:

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 

但更好更快地被使用矢量解决方案muldivsub

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 [ '目标'] = df.v1.mul(df.v3).div(df.v2).sub(基df.v3)' 'df ['target'] = df.v1 * df.v3 /df.v2-df.v3'。如果向量化方法不可行,则使用“apply”解决方案。 – jezrael

0

没有理由使用适用于此。一个简单的矢量化操作将起作用。

df.v1 * df.v3/df.v2