首页 > 解决方案 > 尝试从 Python 中的 pandas 数据框列获取唯一值时,如何克服不可散列的类型:“列表”错误

问题描述

我有一个 Pandas 数据框,其中包含使用 Crowdtangle 收集的 Facebook 数据,我想在其中获取某些列的唯一值。

对于大多数列,像这样的表达式可以正常工作:df.column_name.unique()。例子:

In: df.account_name.unique()

Out: array(['YO TE BANCO VICTOR HUGO MORALES!!!',
       'Lula de novo, com a força do povo',
       'SOCIEDADE CIVIL, LEVANTA E RESISTE !', ..., 'Steemit',
       'BOLSONARO REELEITO EM 2022',
       'WE SUPPORT HUMAN RIGHTS OF SHIAS WORLDWIDE!'], dtype=object)

但是,对于一些列,这样的命令不起作用。相反,我得到了TypeError: unhashable type: 'list'。例如,当我键入此代码时:df.country_mentions_domestic.unique()。

我试图查看此错误消息的其他示例,但没有运气。有人可以看到问题可能是什么吗?

完整错误消息的示例:

In: df.country_mentions_domestic.unique()

Out: TypeError                                 Traceback (most recent call last)
/var/folders/8k/lzt5y36n293d8wkk3svczgnr0000gn/T/ipykernel_2389/3653985748.py in <module>
----> 1 df_fb.country_mentions_domestic.unique()
      2 # print()
      3 # print(df_country_mentions_en.unique())
      4 # print()
      5 # print(df_country_mentions_ru_text.unique())

/usr/local/Cellar/jupyterlab/3.1.10/libexec/lib/python3.9/site-packages/pandas/core/series.py in unique(self)
   2037         Categories (3, object): ['a' < 'b' < 'c']
   2038         """
-> 2039         return super().unique()
   2040 
   2041     @overload

/usr/local/Cellar/jupyterlab/3.1.10/libexec/lib/python3.9/site-packages/pandas/core/base.py in unique(self)
    977                     result = np.asarray(result)
    978         else:
--> 979             result = unique1d(values)
    980 
    981         return result

/usr/local/Cellar/jupyterlab/3.1.10/libexec/lib/python3.9/site-packages/pandas/core/algorithms.py in unique(values)
    429 
    430     table = htable(len(values))
--> 431     uniques = table.unique(values)
    432     uniques = _reconstruct_data(uniques, original.dtype, original)
    433     return uniques

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

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

TypeError: unhashable type: 'list'

标签: pythonpandasdataframeunique-values

解决方案


这意味着该列中至少有一个(如果不是更多)值list不是字符串。

.unique()函数使用它们的哈希值将列中的值相互比较。因为python列表是可变的(即它们可以改变内容),它们不能有一个固定的哈希值与之相关联。

您可以通过以下方式找出哪些:

df[[isinstance(val, list) for val in df.country_mentions_domestic.values]]

如果您确实需要其中一些具有值的集合,则可以将列表更改为元组(或以分号之类的方式分隔的字符串)。元组是不可变的,所以它们可以被散列。


推荐阅读