我希望使用选项 #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'])
答案 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
。 没有可以将核心语言的那部分转换成其他东西的神奇方法。