Pandas: df.duplicated dan drop_duplicates meningkatkan TypeError dengan nilai set dan daftar.

Dibuat pada 22 Mar 2016  ·  3Komentar  ·  Sumber: pandas-dev/pandas

DI:

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

DI LUAR:

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

DI:

df.duplicated()

DI LUAR:

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

Saya berharap:

0    False
1    False
2     True
dtype: bool

pd.show_versions() keluaran:

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

Komentar yang paling membantu

Bagaimana dengan mengabaikan kolom yang tidak dapat di-hash untuk tujuan menghapus duplikat?
Seperti menambahkan kwarg 'unhashable_type' yang defaultnya adalah 'naikkan' (yang berfungsi sebagai saat ini), tetapi dapat diatur ke 'abaikan' (dengan risiko menjatuhkan baris yang tidak sepenuhnya diduplikasi).

Semua 3 komentar

Aku rasa. Anda menggunakan nilai seperti daftar DI DALAM sel bingkai. Ini cukup tidak efisien dan umumnya tidak didukung. pull-requests menerima untuk memperbaiki dalam hal apa pun.

Panda saat ini memberikan TypeError yang sedikit berbeda ( TypeError: unhashable type: 'set' ), yang langsung ke intinya - bagaimana Anda menghapus duplikat set atau daftar? Tidak seperti tupel dan tipe primitif, ini tidak hashable (set dapat dikonversi ke frozenset, yang hashable), jadi Anda harus membuat strategi deduplikasi.

Bagaimanapun, karena Anda berurusan dengan objek dtype, tidak ada jaminan bahwa baris berikutnya tidak akan berisi set atau daftar, jadi deduplikasi ini semakin buruk sejak saat itu. Jadi panda memperlakukan setiap nilai sebagai nilai yang terpisah dan memprosesnya selama nilai tersebut dapat di-hash. Coba saja kolom dengan tiga tupel, itu akan berhasil, lalu ubah yang terakhir menjadi satu set dan itu akan gagal pada nilai itu.

Jadi, saya tidak yakin ada implementasi yang solid yang akan berfungsi di sini mengingat kurangnya hashabilitas dalam daftar, kemungkinan ada perbaikan untuk set, yang akan dikonversi menjadi frozensets pada penyisipan peta hash, tetapi itu tampaknya meretas dan sewenang-wenang .

Bagaimana dengan mengabaikan kolom yang tidak dapat di-hash untuk tujuan menghapus duplikat?
Seperti menambahkan kwarg 'unhashable_type' yang defaultnya adalah 'naikkan' (yang berfungsi sebagai saat ini), tetapi dapat diatur ke 'abaikan' (dengan risiko menjatuhkan baris yang tidak sepenuhnya diduplikasi).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat