Pandas: df.duplicatedとdrop_duplicatesは、設定値とリスト値でTypeErrorを発生させます。

作成日 2016年03月22日  ·  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

最も参考になるコメント

重複を削除する目的でハッシュできない列を無視するのはどうですか?
デフォルトが「raise」(現在のように機能する)であるkwarg「unhashable_type」を追加するのと同様ですが、「ignore」に設定できます(完全に複製されていない行を削除するリスクがあります)。

全てのコメント3件

私は推測する。 フレームのセル内でリストのような値を使用しています。 これは非常に非効率的であり、一般的にサポートされていません。 pull-requestsは、いずれにしても修正を受け入れます。

現在のパンダはわずかに異なるTypeError( TypeError: unhashable type: 'set' )を提供しますが、これは要点に達します-セットまたはリストをどのように重複排除しますか? タプルやプリミティブ型とは異なり、これらはハッシュ可能ではないため(セットは、ハッシュ可能なフリーズセットに変換できます)、重複排除戦略を考え出す必要があります。

いずれにせよ、オブジェクトdtypeを扱っているので、次の行にセットまたはリストが含まれないという保証はありません。したがって、この重複排除はそれ以降悪化するだけです。 したがって、パンダは各値を個別の値として扱い、ハッシュ可能である限りそれらを処理します。 3つのタプルを持つ列を試してみてください。それは機能し、最後のタプルをセットに変更すると、その値で失敗します。

したがって、リストにハッシュ機能がないことを考えると、ここで機能する確実な実装があるかどうかはわかりません。ハッシュマップの挿入時にフリーズセットに変換されるセットの修正がある可能性がありますが、それはハッキーで恣意的です。

重複を削除する目的でハッシュできない列を無視するのはどうですか?
デフォルトが「raise」(現在のように機能する)であるkwarg「unhashable_type」を追加するのと同様ですが、「ignore」に設定できます(完全に複製されていない行を削除するリスクがあります)。

このページは役に立ちましたか?
0 / 5 - 0 評価