2015-11-04 52 views
6

我是新來的Python,我不知道如何解決以下問題。如何在數據框的每一行上應用函數?

我有一個函數:

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

說我有數據幀

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 

而且chck是浮點類型。現在我想將公式應用於數據框的每一行,並將其作爲額外的行'Q'返回。一個例子(即不工作)將是:

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

(僅返回「地圖」類型)

我會更需要在我的項目這種類型的處理,我希望能找到一些作品。

+0

你可以看一下通過這個功能適用功能行:docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html – Litwos

回答

7

因爲我不知道什麼是PartMaster,下面應該工作:

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 

如果你正在做的是一些計算結果的平方根,然後使用np.sqrt方法,這是矢量化和意志是顯著快:

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 

時序

˚F或30K行DF:

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 

你可以看到,NP法〜1900 X更快

+0

很抱歉的partmaster,這是一些代碼嘗試其他功能,我刪除它的清晰度 – Koen

+0

非常感謝工作! – Koen

+0

我強烈建議看看numpy函數,無論你想要做什麼,這樣你就可以在整個df而不是行 – EdChum

0

我同意EdChum的答案。一個更普遍的做法是:

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

YourDataFrame['NewColumn'] = YourDataFrame.apply(RowWiseOperation, axis = 1) 
相關問題