我在熊猫的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
答案 0 :(得分:10)
可能与this issue有关。使用groupby,应用函数被称为一个额外的时间,以查看是否可以进行某些优化。我猜这里发生了类似的事情。目前看起来并没有任何办法(虽然我对你所看到的行为的来源可能是错的)。有没有理由你不需要额外的电话。
此外,当您在列上应用时调用它是正常的。获得一个列时,您将获得一个系列,而不是一个DataFrame。 Series上的apply
将函数应用于每个元素。由于您的列中包含四个元素,因此该函数被调用四次。
答案 1 :(得分:9)
答案 2 :(得分:6)
现在, apply
and applymap
on DataFrame evaluates first row/column only once 。
最初,我们有GroupBy.apply
和Series/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