熊猫应用替代品

时间:2021-01-22 01:14:17

标签: python

我希望使用选项 #2 来获得选项 #1 的结果。

import pandas as pd

df=pd.DataFrame(np.arange(50), columns=['A'])

def test(x):
  v=30
  if v>x:
    return(x)

#option 1
df['A'].apply(lambda x: test(x))

#option 2
test(df['A'])

1 个答案:

答案 0 :(得分:1)

运行您的代码时收到的错误消息说:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

问题在于 a 是一个数组,而 v 是单个值,因此比较中没有单个真值。如果您要检查 v 是否大于 a 中的所有数字,请使用 np.all(v>a)。如果您想检查 v 是否大于一些,请使用 np.any(v>a)

编辑时

您现在对问题进行了大量编辑,现在是一个新问题。 apply 方法的全部意义在于,如果 f 是一个 Python 函数而 v 是一个 numpy 数组,那么 f(v) 可能不是通过将 f 应用于 v 的元素而获得的数组。 Python 不是直接支持矢量化计算的语言。它有时的原因似乎是numpy或pandas中的计算与例如类似计算一样容易矢量化R 是因为 Python 的鸭子类型的工作方式。如果一个类定义了 magic method __add__,那么您可以使用 + 以您想要的任何方式相互添加该类的元素。这正是创建 numpy 的人所做的(以及用于 *,/,< 等事物的其他魔法方法)因此,如果函数定义类似于 def f(x): return x*x + 2*x + 3,其中所有计算步骤都对应于魔术方法,那么 v.apply(f)f(v) 的工作方式相同。您的 test 函数使用关键字 if没有可以将核心语言的那部分转换成其他东西的神奇方法。