Pandas: df.duplicated e drop_duplicates aumentam TypeError com valores de conjunto e lista.

Criado em 22 mar. 2016  ·  3Comentários  ·  Fonte: pandas-dev/pandas

DENTRO:

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

FORA:

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

DENTRO:

df.duplicated()

FORA:

---------------------------------------------------------------------------
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

Eu espero:

0    False
1    False
2     True
dtype: bool

pd.show_versions() output:

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

Comentários muito úteis

Que tal ignorar colunas não hashable para fins de descartar duplicatas?
Como adicionar um kwarg 'unhashable_type' cujo padrão é 'aumentar' (que funciona como o atual), mas pode ser definido como 'ignorar' (correndo o risco de perder linhas que não estão totalmente duplicadas).

Todos 3 comentários

Eu acho. você está usando um valor semelhante a uma lista DENTRO de uma célula de um quadro. Isso é bastante ineficiente e geralmente não tem suporte. pull-request aceita consertar em qualquer evento.

Os pandas atuais fornecem um TypeError ligeiramente diferente ( TypeError: unhashable type: 'set' ), que vai direto ao ponto - como você desduplicaria conjuntos ou listas? Ao contrário das tuplas e dos tipos primitivos, eles não têm hash (os conjuntos podem ser convertidos em frozensets, que são hash), portanto, é necessário criar uma estratégia de desduplicação.

Em qualquer caso, como você está lidando com um tipo de objeto, não há garantia de que a próxima linha não conterá um conjunto ou uma lista, então essa desduplicação só piora a partir de então. Portanto, o pandas trata cada valor como um valor separado e os processa, desde que sejam hasháveis. Apenas tente uma coluna com três tuplas, vai funcionar, então mude a última para um conjunto e irá falhar exatamente naquele valor.

Então, não tenho certeza se há uma implementação sólida que funcionaria aqui, dada a falta de hashability nas listas, poderia haver uma correção para os conjuntos, que seriam convertidos em congelados na inserção do mapa hash, mas isso parece hacky e arbitrário .

Que tal ignorar colunas não hashable para fins de descartar duplicatas?
Como adicionar um kwarg 'unhashable_type' cujo padrão é 'aumentar' (que funciona como o atual), mas pode ser definido como 'ignorar' (correndo o risco de perder linhas que não estão totalmente duplicadas).

Esta página foi útil?
0 / 5 - 0 avaliações