首页 > 解决方案 > 如何在具有 numpy 数组的列的数据框中删除重复项?

问题描述

我正在尝试删除重复项,它适用于普通的 pandas 列,但是当我尝试在一个 numpy 数组的列上执行此操作时出现错误:

new_df = new_df.drop_duplicates(subset=['ticker', 'year', 'embedding'])

我收到此错误:

4 frames
/usr/local/lib/python3.7/dist-packages/pandas/core/algorithms.py in _factorize_array(values, na_sentinel, size_hint, na_value, mask)
    509     table = hash_klass(size_hint or len(values))
    510     uniques, codes = table.factorize(
--> 511         values, na_sentinel=na_sentinel, na_value=na_value, mask=mask
    512     )
    513 

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.factorize()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable._unique()

TypeError: unhashable type: 'numpy.ndarray'

另外,如果它有帮助,这就是我的数据的外观:

ticker  year    embedding
0   a.us    2020.0  [0.0, 0.0, 0.0, 0.62235785, 0.0, 0.27049118, 0...
1   a.us    2020.0  [0.0, 0.0, 0.0, 0.62235785, 0.0, 0.27049118, 0..

我考虑过转换为字符串,但我需要 pandas 列中的数组保持为 numpy,所以我不确定如何在这里干净地删除重复项。

标签: pythonpandas

解决方案


在这里我会做什么:

>>> df
  ticker  year                                     embedding
0   a.us  2020  [0.0, 0.0, 0.0, 0.62235785, 0.0, 0.27049118]
1   a.us  2020  [0.0, 0.0, 0.0, 0.62235785, 0.0, 0.27049118]

>>> cond1 = df.drop(columns="embedding").duplicated()
>>> cond1
0    False
1     True
dtype: bool

>>> cond2 = pd.DataFrame(df["embedding"].to_list()).duplicated()
>>> cond2
0    False
1     True
dtype: bool

要删除重复值:

>>> df[~(cond1 & cond2)]
  ticker  year                                     embedding
0   a.us  2020  [0.0, 0.0, 0.0, 0.62235785, 0.0, 0.27049118]

推荐阅读