gpt4 book ai didi

python - pandas dataframe - 过滤会产生意外错误 'unorderable types'

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:13 26 4
gpt4 key购买 nike

下面的 Python 片段给我一个错误:

df = pandas.DataFrame({'A': ['UBS','UBS','ABB','UBS'], 'B': ['L', 'L', 'L', 'D']})
cols = ['A', 'A', 'B']
df = df[cols]
df = df[df['A'].isin(['UBS']) & (df['B'] != 'D')]

我得到的错误是 unorderable types: str() < int() .如果它提示重复的列,我会理解,但为什么它尝试(并且失败)比较整数和字符串?

如果我将最后一行替换为 df = df[df['A'].isin(['UBS'])]我确实收到了预期的错误消息,cannot reindex from a duplicate axis .

不可否认,这个示例是人为设计的(它是真实代码的简化示例),如果我交换最后两行,代码工作正常,但我仍然想了解错误。

最佳答案

Pandas计算时出现异常

df['A'].isin(['UBS']) & (df['B'] != 'D')

第一个表达式是 bool 值 Dataframe,第二个是 bool 值 Series。 DataFrame的主轴,列轴,有索引

Index(['A', 'A'], dtype='object')

虽然系列的主轴有索引

Int64Index([0, 1, 2, 3], dtype='int64')

Pandas 尝试对齐这两个索引,并且作为该过程的一部分,比较索引中的值。在 Python2 中,字符串和整数是可比较的,在 Python3 中,比较会引发异常。


如果在Python3下运行代码,回溯错误信息以

结尾
  File "/home/unutbu/.virtualenvs/muffy/lib/python3.4/site-packages/pandas-0.15.2_226_ge1aaf8c-py3.4-linux-x86_64.egg/pandas/core/index.py", line 2005, in _join_monotonic
join_index, lidx, ridx = self._outer_indexer(sv, ov)
File "pandas/src/generated.pyx", line 8558, in pandas.algos.outer_join_indexer_object (pandas/algos.c:157918)
TypeError: unorderable types: str() < int()

现在如果你插入

import pdb
pdb.set_trace()

进入异常抛出前的代码,然后重新运行脚本,可以在Python最后一行出现异常的地方设置断点:

(Pdb) b /home/unutbu/.virtualenvs/muffy/lib/python3.4/site-packages/pandas-0.15.2_226_ge1aaf8c-py3.4-linux-x86_64.egg/pandas/core/index.py:2005
Breakpoint 1 at /home/unutbu/.virtualenvs/muffy/lib/python3.4/site-packages/pandas-0.15.2_226_ge1aaf8c-py3.4-linux-x86_64.egg/pandas/core/index.py:2005
(Pdb) cont
> /home/unutbu/.virtualenvs/muffy/lib/python3.4/site-packages/pandas-0.15.2_226_ge1aaf8c-py3.4-linux-x86_64.egg/pandas/core/index.py(2005)_join_monotonic()
-> join_index, lidx, ridx = self._outer_indexer(sv, ov)

现在您可以检查有问题的变量的值:

(Pdb) p sv
array(['A', 'A'], dtype=object)
(Pdb) p ov
array([0, 1, 2, 3], dtype=object)
(Pdb) q

这表明 sv 包含字符串,ov 包含整数。在 Python2 中,strint 是可比较的 -- In CPython any str is greater than any int -- 因此当 lvalrval 进行比较时,pandas/src/generated.pyx 中不会出现异常:

        elif lval < rval:
count += 1
i += 1

但是in Python3, strs and ints are no longer comparable .因此在 Python3 中比在 Python2 中更早引发异常。在 Python2 中,错误稍后出现并引发

cannot reindex from a duplicate axis

使用 df = df[df['A'].isin(['UBS'])] 会得到相同的错误,而不是 unorderable types 错误, 因为这里没有 &

关于python - pandas dataframe - 过滤会产生意外错误 'unorderable types',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877199/

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