当比较数据栏中的列时,我很难理解熊猫的行为。我想要做的是对不同的列应用逻辑操作,并根据逻辑的结果生成一个计算为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的区别是和vs &.我怀疑在幕后发生了一些明智的事情,我不完全理解。但是为什么Ex 1会出错呢?不需要额外的括号,对吗?Condition1 &条件2 (Condition1) & (Condition2)
为什么会产生不同的结果呢?更重要的是,这是在哪里记录的?我只是想扩大我自己的学习和理解,学会如何自己处理这样的问题。
谢谢!
发布于 2016-01-10 04:52:20
为了回答你的问题,
答:我认为这是“如果”造成的。您可以将" if“作为一个函数来考虑,它只接受真/假或具有已知的真/假计算值的东西(即如果1,if -1,如果0,如果没有)。您可以参考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().如果你还想知道更多的细节,我会把你推荐给熊猫的源代码作为https://github.com/pydata/pandas/blob/master/pandas/core/generic.py。
如果您检查错误消息,
>>> 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“的运算符优先于(<,>),因此和工作。
为了进一步挖掘它,我相信检查源代码将是一个很好的方法。希望它能回答你的问题。
https://stackoverflow.com/questions/34701974
复制相似问题