为什么pandas应用计算两次

时间:2014-02-07 19:11:46

标签: python pandas apply

我在熊猫的DataFrame对象上使用apply方法。当我的DataFrame有一个列时,看起来应用函数被调用两次。问题是为什么?而且,我可以阻止这种行为吗?

代码:

import pandas as pd

def mul2(x):
    print 'hello'
    return 2*x

df = pd.DataFrame({'a': [1,2,0.67,1.34]})

print df.apply(mul2)

输出:

hello
hello

0  2.00
1  4.00
2  1.34
3  2.68

我正在应用的函数中打印'hello'。我知道它被应用了两次因为'你好'打印了两次。更重要的是,如果我有两列,'你好'打印3次。更进一步的是当我打电话给'hello'专栏打印4次时。

代码:

print df.a.apply(mul2)

输出:

hello
hello
hello
hello
0    2.00
1    4.00
2    1.34
3    2.68
Name: a, dtype: float64

3 个答案:

答案 0 :(得分:10)

可能与this issue有关。使用groupby,应用函数被称为一个额外的时间,以查看是否可以进行某些优化。我猜这里发生了类似的事情。目前看起来并没有任何办法(虽然我对你所看到的行为的来源可能是错的)。有没有理由你不需要额外的电话。

此外,当您在列上应用时调用它是正常的。获得一个列时,您将获得一个系列,而不是一个DataFrame。 Series上的apply将函数应用于每个元素。由于您的列中包含四个元素,因此该函数被调用四次。

答案 1 :(得分:9)

此行为旨在作为优化。

请参阅docs

  

在当前实现中,在第一个上应用调用func两次   列/行,以决定是否可以采用快速或慢速代码路径。   如果func有副作用,这会导致意外行为   将对第一列/行生效两次。

答案 2 :(得分:6)

此行为已在pandas 1.1中修复,请升级!

现在, apply and applymap on DataFrame evaluates first row/column only once

最初,我们有GroupBy.applySeries/df.apply对第一组进行了两次评估。第一组进行两次评估的原因是,apply想要知道它是否可以“优化”计算(有时,如果apply收到numpy或cythonized函数,则可以这样做)。使用大熊猫0.25时,this behavior was fixed for GroupBy.apply。现在,对于熊猫1.1,df.apply也将修复该问题。


旧行为 [熊猫<= 1.0.X]

pd.__version__ 
# '1.0.4'

df.apply(mul2)
hello
hello

      a
0  2.00
1  4.00
2  1.34
3  2.68

新行为 [熊猫> = 1.1]

pd.__version__
# '1.1.0.dev0+2004.g8d10bfb6f'

df.apply(mul2)
hello

      a
0  2.00
1  4.00
2  1.34
3  2.68