我是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
而ch和ck是浮点类型。现在,我想将公式应用于数据帧的每一行,并将其作为额外的行“ Q”返回。一个示例(不起作用)将是:
ch
ck
df['Q']= map(lambda p, D: EOQ(D,p,ck,ch),df['p'], df['D'])
(仅返回“地图”类型)
在我的项目中,我将需要更多此类处理,并希望找到可行的方法。
以下应该工作:
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矢量化的方法,它将大大加快速度:
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
时机
对于3万行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