如何对数据帧上的每一行应用函数?

2024-05-13 18:36:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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']) 

(仅返回“map”类型)

我将需要在我的项目中更多的这种类型的处理,我希望找到一些工作。


Tags: 数据功能类型mapdataframedfreturndef
1条回答
网友
1楼 · 发布于 2024-05-13 18:36:32

以下方法应该有效:

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倍

相关问题 更多 >