如何在数据框的每一行上应用函数?
Posted
技术标签:
【中文标题】如何在数据框的每一行上应用函数?【英文标题】:How to apply a function on every row on a dataframe? 【发布时间】:2016-02-04 17:27:20 【问题描述】:我是 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'])
(仅返回“地图”类型)
我将在我的项目中更多地需要这种类型的处理,我希望能找到一些可行的方法。
【问题讨论】:
您可以查看将函数应用于行的此函数:docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html 你的意思是现在我想将公式应用于数据帧上的每一行并将其作为额外的COLUMN'Q'返回。 【参考方案1】:以下应该有效:
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
【讨论】:
以上是关于如何在数据框的每一行上应用函数?的主要内容,如果未能解决你的问题,请参考以下文章
在Pandas中,我如何将一个函数应用到数据框的某一行,其中行中的每一项都应该作为参数传递给函数?