我是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'。一个例子(不起作用)将是:
df['Q']= map(lambda p, D: EOQ(D,p,ck,ch),df['p'], df['D'])
(仅返回'地图'类型)
我的项目中需要更多这种类型的处理,我希望找到有用的东西。
答案 0 :(得分:18)
以下内容应该有效:
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