gpt4 book ai didi

python - pandas 中的向量化列比较问题

转载 作者:行者123 更新时间:2023-12-01 04:12:38 35 4
gpt4 key购买 nike

在比较数据框中的列时,我无法理解 pandas 的行为。我想要做的是将逻辑运算应用于不同的列,并生成一个结果列,该结果列根据逻辑结果评估为 True 或 False。 (逻辑也可能适用于使用 .shift() 生成的滞后列值,但我认为这对于这个问题来说没有必要。)

问题是我理解比较 df.A < df.B 是矢量化的(所以它非常快)并且应该产生一个逐个元素的结果。当我分配给一个系列时,这有效,但是当我尝试将它分配给一个新列时,它会出错。这是一个例子:

df = pd.DataFrame(np.random.randn(10,2),index=(np.arange(10)),columns=['A','B'])
df['C'] = False # must add column with [] notation rather than .C
a = df.A < df.B
df.C = A
df

这会产生预期的输出:

          A         B      C
0 1.222631 0.568988 False
1 -0.719666 0.733197 True
2 -2.434720 -0.131745 True
3 0.653228 0.428794 False
4 0.862103 0.402158 False
5 -0.256027 -0.819937 False
6 -1.728418 1.463709 True
7 -1.110928 -2.173016 False
8 0.656576 -1.218179 False
9 0.014519 -0.854039 False

因此,继续尝试,无需执行分配给系列的中间步骤:

df['C'] = False  # not necessary but a reset
if df.A < df.B: df.C = True

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

所以这里的问题是为什么当我第一次浏览该系列时它可以工作,但不能直接分配给列?我怀疑这种行为还有更多我不明白的地方。

让我继续举一个相关的例子。我知道 np.where() 可能是比 if 语句更干净的操作方式,但我仍然遇到了一个缺乏理解的问题。我认为以下三行应该是等效的:

df['C'] = np.where((df.A < 0 & df.B > df.A), True, False)  #1 Errors
df['C'] = np.where((df.A < 0) and (df.B > df.A), True, False) #2 Errors
df['C'] = np.where((df.A < 0) & (df.B > df.A), True, False) #3 Works

#2 和 #3 之间的区别是 and 与 &...我怀疑在幕后发生了一些我不完全理解的事情。但为什么Ex 1会出错呢?不需要额外的括号,对吗?条件 1 和条件 2(条件1)和(条件2)

为什么会产生不同的结果?更重要的是,这记录在哪里?只是想扩大我自己的学习和理解,并学习如何自己处理此类问题。

谢谢!

最佳答案

回答您的问题,

  • 如果 df.A < df.B: df.C = True 失败,为什么会失败?

Ans:我认为这是由“if”引起的。您可以将“if”视为一个函数,它只接受 True/False 或具有已知 True/False 评估的内容(即 if 1、if -1、if 0、if None)。您可以引用https://docs.python.org/2/library/stdtypes.html 。基本上,Python 中的所有内容都是扩展对象类。如果类具有非零len的实现,“if”应该起作用。您可以尝试以下操作:

>>> x = 1
>>> x.__nonzero__()
True
>>> x = df.C
>>> x.__nonzero__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/pandas/core/generic.py", line 731, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果您还想了解更多详细信息,我将向您推荐 pandas 源代码 https://github.com/pydata/pandas/blob/master/pandas/core/generic.py

  • 为什么 and 不能与 & 进行比较?

我认为已经得到解答Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?

  • 为什么我们需要支架?

如果您检查错误消息,

>>> df.B>df.A & df.A <0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/pandas/core/ops.py", line 786, in wrapper
return filler(self._constructor(na_op(self.values, other.values),
File "/Library/Python/2.7/site-packages/pandas/core/ops.py", line 758, in na_op
result = lib.vec_binop(x, y, op)
File "pandas/lib.pyx", line 914, in pandas.lib.vec_binop (pandas/lib.c:16248)
File "pandas/lib.pyx", line 907, in pandas.lib.vec_binop (pandas/lib.c:16122)
TypeError: unsupported operand type(s) for &: 'float' and 'bool'

这实际上意味着 & 运算符试图在 float 和 bool 之间使用。 float 在哪里, bool 值在哪里? bool 为 df.B>df.A,float 为 df.A。这意味着什么?这意味着 & 的运算符优先级高于 (<,>),请检查此 https://www.ibiblio.org/swaroopch/byteofpython/read/operator-precedence.html

另一方面,“and”的运算符优先级高于 (<,>),因此 and 有效。

要自己进一步挖掘,我相信检查源代码将是一个好方法。希望它能解答您的问题。

关于python - pandas 中的向量化列比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701974/

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