使用函数处理pandas.apply()

时间:2018-01-26 13:04:15

标签: python pandas

我需要为熊猫数据框添加一些计算列。其中一些列需要将值传递给特定函数。

我遇到了一些我不理解的行为。 参考以下代码片段

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
  1. 为什么apply方法花了这么多时间?
  2. 这是正确的方法吗?如果不是那么是什么?
  3. PS:有人建议使用Cython。这真的会影响性能吗?

2 个答案:

答案 0 :(得分:2)

apply功能没有利用矢量化...每次调用该功能时,它都会创建一个全新的系列,所以说数百万行就是这样的。很多IO开销。

查看Github问题并查看讨论Pandas Issue 11615

这个其他StackOverflow帖子中接受的答案也提到了它。

Pandas - Explanation on apply function being slow

答案 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