web-dev-qa-db-ja.com

データフレームのすべての行に関数を適用する方法は?

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はfloat型です。ここで、データフレームのすべての行に式を適用し、追加の行「Q」として返します。例(動作しない)は次のとおりです。

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

(「マップ」タイプのみを返します)

私のプロジェクトではこのタイプの処理がさらに必要になりますが、機能するものを見つけたいと思っています。

14
Koen

以下が機能するはずです。

def EOQ(D,p,ck,ch):
    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

タイミング

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速いことがわかります

19
EdChum

EdChumの答えに同意します。より一般的なアプローチは次のとおりです。

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

YourDataFrame['NewColumn'] = YourDataFrame.apply(RowWiseOperation, axis = 1)
0
Subspacian