首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫矢量化栏目比较问题研究

大熊猫矢量化栏目比较问题研究
EN

Stack Overflow用户
提问于 2016-01-10 04:11:04
回答 1查看 115关注 0票数 1

当比较数据栏中的列时,我很难理解熊猫的行为。我想要做的是对不同的列应用逻辑操作,并根据逻辑的结果生成一个计算为True或False的结果列。(逻辑可能也适用于使用.shift()生成的滞后列值,但我认为这对这个问题没有必要。)

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

代码语言:javascript
复制
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

这将产生预期的产出:

代码语言:javascript
复制
          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

因此,继续并尝试,而不经过分配给一个系列的中间步骤:

代码语言:javascript
复制
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语句更简洁的操作方式,但我仍然遇到了一个问题,即缺乏理解。这里有三行我认为应该是等价的:

代码语言:javascript
复制
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的区别是和vs &.我怀疑在幕后发生了一些明智的事情,我不完全理解。但是为什么Ex 1会出错呢?不需要额外的括号,对吗?Condition1 &条件2 (Condition1) & (Condition2)

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 04:52:20

为了回答你的问题,

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

答:我认为这是“如果”造成的。您可以将" if“作为一个函数来考虑,它只接受真/假或具有已知的真/假计算值的东西(即如果1,if -1,如果0,如果没有)。您可以参考https://docs.python.org/2/library/stdtypes.html。基本上,python中的所有内容都在扩展对象类。如果类具有非零len的实现,则" If“应该有效。您可以尝试以下几种方法:

代码语言:javascript
复制
>>> 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().

如果你还想知道更多的细节,我会把你推荐给熊猫的源代码作为https://github.com/pydata/pandas/blob/master/pandas/core/generic.py

  • 与&?相比,为什么和不起作用?

我想答案是Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?

  • 为什么我们需要托架?

如果您检查错误消息,

代码语言:javascript
复制
>>> 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'

这意味着&操作符实际上是试图在浮点和bool之间使用。浮子在哪里,布尔在哪里?bool是df.B>df.A,浮子是df.A,这意味着什么?它的意思是&没有运算符优先于(<,>),请检查此https://www.ibiblio.org/swaroopch/byteofpython/read/operator-precedence.html

另一方面," and“的运算符优先于(<,>),因此和工作。

为了进一步挖掘它,我相信检查源代码将是一个很好的方法。希望它能回答你的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34701974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档