为什么pandas应用计算两次

piR*_*red 27 python apply pandas

我在熊猫的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)
Run Code Online (Sandbox Code Playgroud)

输出:

hello
hello

0  2.00
1  4.00
2  1.34
3  2.68
Run Code Online (Sandbox Code Playgroud)

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

码:

print df.a.apply(mul2)
Run Code Online (Sandbox Code Playgroud)

输出:

hello
hello
hello
hello
0    2.00
1    4.00
2    1.34
3    2.68
Name: a, dtype: float64
Run Code Online (Sandbox Code Playgroud)

MER*_*ose 14

此行为旨在作为优化.

查看文档:

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

  • 有办法避免这种情况吗? (2认同)
  • 显然> = 0.25.0已解决此问题。 (2认同)

Bre*_*arn 13

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

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


cs9*_*s95 10

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

现在,applyapplymap对数据帧计算第一行/列只有一次

最初,我们不得不GroupBy.applySeries/df.apply两次评估第一组。第一组被评估两次的原因是因为 apply 想知道它是否可以“优化”计算(如果 apply 收到一个 numpy 或 cythonized 函数,有时这是可能的)。在 pandas 0.25 中,此行为已针对 GroupBy.apply 修复。现在,在 pandas 1.1 中,df.apply 也将修复此问题。


旧行为[pandas <= 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
Run Code Online (Sandbox Code Playgroud)

新行为[熊猫 >= 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
Run Code Online (Sandbox Code Playgroud)