2015-11-04 10 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']) 

(リターンのみのタイプを「マップ」)

私は私のプロジェクトでは、より多くの処理のこのタイプが必要になりますし、私が働く何かを見つけることを願っています。あなたには、いくつかの結果の平方根を計算してやっているすべては、その後、これがベクトル化されnp.sqrtメソッドを使用する場合は

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 

をしてます:

+0

あなたが行に関数を適用し、この機能に目を通すことができます。partmasterためdocs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html – Litwos

答えて

7

私はPartMasterが何であるかを知らないので、次のように動作するはずです大幅に高速化すること:

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

は申し訳ありませんが、それは別の機能を試すためのコードでしたが、私はそれを明確にするために削除しました – 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) 
関連する問題