Pandas: df.duplicated и drop_duplicates вызывают TypeError со значениями set и list.

Созданный на 22 мар. 2016  ·  3Комментарии  ·  Источник: pandas-dev/pandas

В:

import pandas as pd
df = pd.DataFrame([[{'a', 'b'}], [{'b','c'}], [{'b', 'a'}]])
df

ВНЕ:

    0
0   {a, b}
1   {c, b}
2   {a, b}

В:

df.duplicated()

ВНЕ:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-77-7cc63ba1ed41> in <module>()
----> 1 df.duplicated()

venv/lib/python3.5/site-packages/pandas/util/decorators.py in wrapper(*args, **kwargs)
     89                 else:
     90                     kwargs[new_arg_name] = new_arg_value
---> 91             return func(*args, **kwargs)
     92         return wrapper
     93     return _deprecate_kwarg

venv/lib/python3.5/site-packages/pandas/core/frame.py in duplicated(self, subset, keep)
   3100 
   3101         vals = (self[col].values for col in subset)
-> 3102         labels, shape = map(list, zip(*map(f, vals)))
   3103 
   3104         ids = get_group_index(labels, shape, sort=False, xnull=False)

TypeError: type object argument after * must be a sequence, not map

Я ожидаю:

0    False
1    False
2     True
dtype: bool

pd.show_versions() вывод:

INSTALLED VERSIONS
------------------
commit: None
python: 3.5.1.final.0
python-bits: 64
OS: Linux
OS-release: 4.3.0-1-amd64
machine: x86_64
processor: 
byteorder: little
LC_ALL: None
LANG: ru_RU.UTF-8

pandas: 0.18.0
nose: None
pip: 1.5.6
setuptools: 18.8
Cython: None
numpy: 1.10.4
scipy: None
statsmodels: None
xarray: None
IPython: 4.1.2
sphinx: None
patsy: None
dateutil: 2.5.1
pytz: 2016.1
blosc: None
bottleneck: None
tables: None
numexpr: None
matplotlib: 1.5.1
openpyxl: None
xlrd: None
xlwt: None
xlsxwriter: None
lxml: None
bs4: None
html5lib: 0.999
httplib2: None
apiclient: None
sqlalchemy: 1.0.12
pymysql: None
psycopg2: 2.6.1 (dt dec pq3 ext lo64)
jinja2: 2.8
boto: None
Bug Missing-data

Самый полезный комментарий

Как насчет игнорирования нехэшируемых столбцов с целью удаления дубликатов?
Подобно добавлению kwarg 'unhashable_type', значение по умолчанию которого равно 'raise' (которое работает как текущее), но может быть установлено на 'ignore' (с риском отбрасывания строк, которые не полностью дублируются).

Все 3 Комментарий

Наверное. вы используете значение в виде списка ВНУТРИ ячейки кадра. Это довольно неэффективно и обычно не поддерживается. pull-request принимает исправление в любом случае.

Текущая pandas дает немного другую ошибку TypeError ( TypeError: unhashable type: 'set' ), которая действительно подходит к делу - как бы вы дедуплицировали наборы или списки? В отличие от кортежей и примитивных типов, они не являются хешируемыми (наборы могут быть преобразованы в фрозенсеты, которые являются хешируемыми), поэтому вам нужно придумать стратегию дедупликации.

В любом случае, поскольку вы имеете дело с объектом dtype, нет гарантии, что следующая строка не будет содержать набор или список, поэтому с этого момента дедупликация только ухудшится. Таким образом, pandas рассматривает каждое значение как отдельное и обрабатывает их, пока они доступны для хеширования. Просто попробуйте столбец с тремя кортежами, он будет работать, затем измените последний на набор, и он потерпит неудачу на этом самом значении.

Итак, я не уверен, что есть надежная реализация, которая будет работать здесь, учитывая отсутствие хэшируемости в списках, потенциально может быть исправление для наборов, которые будут преобразованы в frozensets при вставке хеш-карты, но это действительно кажется хакерским и произвольным .

Как насчет игнорирования нехэшируемых столбцов с целью удаления дубликатов?
Подобно добавлению kwarg 'unhashable_type', значение по умолчанию которого равно 'raise' (которое работает как текущее), но может быть установлено на 'ignore' (с риском отбрасывания строк, которые не полностью дублируются).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги