我需要为熊猫数据框添加一些计算列。其中一些列需要将值传递给特定函数。
我遇到了一些我不理解的行为。 参考以下代码片段
from numpy.random import randn
from pandas import Dataframe
def just_sum(a,b):
return a + b
# 1,000,000 columns with random data
df = DataFrame(randn(1000000, 2), columns=list('ab'))
df['reg_sum'] = df.a + df.b
#works almost instantly
df['f_sum'] = df.apply(lambda x: just_sum(x.a, x.b), axis = 1)
# takes little more thatn 30 seconds
答案 0 :(得分:2)
apply
功能没有利用矢量化...每次调用该功能时,它都会创建一个全新的系列,所以说数百万行就是这样的。很多IO开销。
查看Github问题并查看讨论Pandas Issue 11615
这个其他StackOverflow帖子中接受的答案也提到了它。
答案 1 :(得分:0)
回答这个问题,因为它有2个部分。
正如@Orenshi所说,apply函数没有利用矢量化。 正确的方法是vectorize函数。因此,问题中的代码段可以写成:
from numpy.random import randn
from numpy import vectorize
from pandas import Dataframe
def just_sum(a,b):
return a + b
# 1,000,000 columns with random data
df = DataFrame(randn(1000000, 2), columns=list('ab'))
vector_sum = vectorize(just_sum)
df['f_sum'] = vector_sum(df.a, df.b)
#works almost instantly