gpt4 book ai didi

python - 为什么 python lambda 看到的是一个序列而不是一个值?

转载 作者:行者123 更新时间:2023-12-01 06:48:49 25 4
gpt4 key购买 nike

我创建了一个 Pandas DataFrame:

df = pd.DataFrame( {'some_number' : [1,2,3,4,5,6]})

enter image description here

然后我想添加一个名为 is_even 的列:

df.assign(
is_even = lambda x : 'YES' if x.some_number % 2 == 0 else 'NO'
)

我收到错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我知道错误告诉我 if 语句后的 x.some_number 是一个系列。这让我感到困惑,因为如果我这样做:

df.assign(
is_even = lambda x : 'YES' if 1==2 else x.some_number
)

它可以工作并生成以下输出:

enter image description here

这表明 x.some_number 实际上不是一个序列,而是一个标量值。

我知道还有其他方法可以实现我想要实现的目标。但我对这种行为很感兴趣。

为什么当 x.some_number 在 if 子句之后时,它被视为一个 Series,但当它在 else 子句中使用时,它被视为一个值?

INSTALLED VERSIONS
------------------
python : 3.8.0.final.0
python-bits : 32
OS : Windows
OS-release : 10
machine : AMD64
processor : Intel64 Family 6 Model 158 Stepping 10, GenuineIntel
byteorder : little
LOCALE : English_United States.1252

pandas : 0.25.3
numpy : 1.17.4
IPython : 7.10.0
matplotlib : 3.1.2

最佳答案

问题仅在于 if 语句,您在第一个示例中将一系列与标量值进行比较。这永远不会起作用。第二个示例之所以有效,是因为您有一个标量 if 语句(这当然没问题)并且返回一个 Series。返回一个系列(或一个标量)正是传递给 assign 的函数需要做的事情。

现在,您真正想要做的是逐行比较。使用 apply 来实现

df['is_even'] = df.some_number.apply(lambda x: 'YES' if x % 2 == 0 else 'NO' )

这里,x 是标量,if 语句按预期工作。或者,您可以组合分配和 lambda 函数

df.assign(
is_even = lambda x : x.some_number.apply(lambda x: 'YES' if x % 2 == 0 else 'NO')
)

请再次注意第一个示例的差异:外部 lambda 确保内部 lambda 仅需要处理 if x % 2 == 0 中的标量。外部 lambda 返回一个 Series,就像您的第二个示例一样。

关于python - 为什么 python lambda 看到的是一个序列而不是一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59113963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com