Pandas: df.duplicated et drop_duplicates lèvent TypeError avec les valeurs set et list.

Créé le 22 mars 2016  ·  3Commentaires  ·  Source: pandas-dev/pandas

DANS:

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

EN DEHORS:

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

DANS:

df.duplicated()

EN DEHORS:

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

Je m'attends à:

0    False
1    False
2     True
dtype: bool

pd.show_versions() sortie :

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

Commentaire le plus utile

Que diriez-vous d'ignorer les colonnes illisibles dans le but de supprimer les doublons ?
Comme l'ajout d'un kwarg 'unhashable_type' dont la valeur par défaut est 'raise' (qui fonctionne comme en cours), mais peut être défini sur 'ignore' (au risque de supprimer des lignes qui ne sont pas entièrement dupliquées).

Tous les 3 commentaires

Je suppose. vous utilisez une valeur de type liste À L'INTÉRIEUR d'une cellule d'un cadre. Ceci est assez inefficace et n'est généralement pas pris en charge. pull-requests accepte de corriger dans tous les cas.

Les pandas actuels donnent une TypeError légèrement différente ( TypeError: unhashable type: 'set' ), qui va droit au but : comment dédupliqueriez-vous des ensembles ou des listes ? Contrairement aux tuples et aux types primitifs, ceux-ci ne sont pas hachables (les ensembles peuvent être convertis en ensembles gelés, qui sont hachables), vous devez donc élaborer une stratégie de déduplication.

Dans tous les cas, puisque vous avez affaire à un type d'objet, il n'y a aucune garantie que la ligne suivante ne contiendra pas un ensemble ou une liste, donc cette déduplication ne fait qu'empirer à partir de là. Ainsi, les pandas traitent chaque valeur comme une valeur distincte et les traitent tant qu'elles sont hachables. Essayez simplement une colonne avec trois tuples, cela fonctionnera, puis changez le dernier en un ensemble et il échouera sur cette valeur même.

Donc, je ne suis pas sûr qu'il y ait une implémentation solide qui fonctionnerait ici étant donné le manque de hachage dans les listes, il pourrait potentiellement y avoir un correctif pour les ensembles, qui seraient convertis en ensembles gelés lors de l'insertion de la carte de hachage, mais cela semble bidon et arbitraire .

Que diriez-vous d'ignorer les colonnes illisibles dans le but de supprimer les doublons ?
Comme l'ajout d'un kwarg 'unhashable_type' dont la valeur par défaut est 'raise' (qui fonctionne comme en cours), mais peut être défini sur 'ignore' (au risque de supprimer des lignes qui ne sont pas entièrement dupliquées).

Cette page vous a été utile?
0 / 5 - 0 notes