Pandas: df.duplicated y drop_duplicates generan TypeError con valores establecidos y de lista.

Creado en 22 mar. 2016  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

EN:

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

FUERA:

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

EN:

df.duplicated()

FUERA:

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

Espero:

0    False
1    False
2     True
dtype: bool

pd.show_versions() salida:

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

Comentario más útil

¿Qué tal si se ignoran las columnas que no se pueden aplicar hash con el fin de eliminar duplicados?
Como agregar un kwarg 'unhashable_type' cuyo valor predeterminado es 'raise' (que funciona como actual), pero se puede configurar para 'ignorar' (con el riesgo de eliminar filas que no están completamente duplicadas).

Todos 3 comentarios

Supongo. está utilizando un valor similar a una lista DENTRO de una celda de un marco. Esto es bastante ineficiente y, en general, no se admite. pull-request acepta arreglar en cualquier caso.

Los pandas actuales dan un TypeError ligeramente diferente ( TypeError: unhashable type: 'set' ), que va al grano: ¿cómo deduplicarías conjuntos o listas? A diferencia de las tuplas y los tipos primitivos, estos no son hash (los conjuntos se pueden convertir a frozensets, que son hash), por lo que debe idear una estrategia de deduplicación.

En cualquier caso, dado que está tratando con un objeto dtype, no hay garantía de que la siguiente fila no contenga un conjunto o una lista, por lo que esta deduplicación solo empeora a partir de ese momento. Entonces, los pandas tratan cada valor como uno separado y los procesan siempre que sean hash. Simplemente pruebe una columna con tres tuplas, funcionará, luego cambie la última para que sea un conjunto y fallará en ese mismo valor.

Por lo tanto, no estoy seguro de que haya una implementación sólida que funcione aquí dada la falta de capacidad de hash en las listas, podría haber una solución para los conjuntos, que se convertirían en conjuntos congelados al insertar el mapa hash, pero eso parece hack y arbitrario .

¿Qué tal si se ignoran las columnas que no se pueden aplicar hash con el fin de eliminar duplicados?
Como agregar un kwarg 'unhashable_type' cuyo valor predeterminado es 'raise' (que funciona como actual), pero se puede configurar para 'ignorar' (con el riesgo de eliminar filas que no están completamente duplicadas).

¿Fue útil esta página
0 / 5 - 0 calificaciones