我是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'])
(仅返回“ map ”类型)
在我的项目中,我将需要更多此类处理,并希望找到可行的方法。
最佳答案
以下应该工作:
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
时间
对于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
关于python - 如何在数据框的每一行上应用函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33518124/