python - 尝试从 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'
解决方案
这意味着该列中至少有一个(如果不是更多)值list
不是字符串。
该.unique()
函数使用它们的哈希值将列中的值相互比较。因为python列表是可变的(即它们可以改变内容),它们不能有一个固定的哈希值与之相关联。
您可以通过以下方式找出哪些:
df[[isinstance(val, list) for val in df.country_mentions_domestic.values]]
如果您确实需要其中一些具有值的集合,则可以将列表更改为元组(或以分号之类的方式分隔的字符串)。元组是不可变的,所以它们可以被散列。
推荐阅读
- python - Python中的非二叉树数据结构
- angular - 在导航侧边栏中,Angular Material CDK Overlay 滚动块不起作用
- flutter - Flutter:ListView:当子 ListView 到达底部时滚动父 ListView - ClampingScrollPhysics 在大小容器中不起作用
- mysql - 在 IN() 条件中混合引用和未引用的值 - MySQL 怪癖或一般问题?
- typescript - 如何在给定枚举值的情况下指定同级字段类型?
- python - 填充和注意掩码在 GPT 语言模型的批量输入中无法按预期工作
- java - Modern Java in Action 中有关 java 流 dropWhile 示例的问题
- android - 命令:`react-native run-android` 挂在“信息正在启动 JS 服务器...”
- python - 如何使用 python 子进程执行命令并响应多个输入?
- c# - 你可以在 Razor 页面中使用点表示法和 ViewData 吗?