Pandas报错TypeError: unhashable type: 'list',求解决重复手机号查询问题
解决pandas查找重复电话号码时的
TypeError: unhashable type: 'list'错误 这个错误出现的原因很直接:你的phone列里存储的是列表(list)类型的数据,而pandas用来检测重复的方法(比如duplicated()、value_counts())要求数据是可哈希(hashable)的类型,但列表是不可哈希的——因为它是可变对象,所以没法直接用来做重复检测。
下面给你两种针对性的解决方案,根据你的数据情况选择:
方案1:如果phone列的列表都是单元素(如示例数据)
从你的示例看,每个phone值都是只包含一个号码的列表,那我们可以直接提取列表里的唯一元素,把列转换成数值/字符串类型,之后再找重复:
import pandas as pd import numpy as np # 你的原始数据 df = pd.DataFrame( [ [["John Muller"], "person", [8866155845]], [["Innovation Division"], "company", np.nan], [["Carol Sway"], "person", [8866155845]], ], columns=["name", "kind", "phone"], ) # 第一步:提取列表中的元素,处理NaN(因为np.nan不是列表,直接保留) df['phone_clean'] = df['phone'].apply(lambda x: x[0] if isinstance(x, list) else x) # 第二步:查找重复的电话号码 duplicate_phones = df[df['phone_clean'].duplicated(keep=False)] print(duplicate_phones)
运行后输出:
name kind phone phone_clean 0 [John Muller] person [8866155845] 8866155845 2 [Carol Sway] person [8866155845] 8866155845
解释:
isinstance(x, list)用来判断当前值是不是列表,避免对NaN报错x[0]提取列表里的唯一号码,把列转换成了可哈希的整数类型duplicated(keep=False)会标记所有重复的行,而不只是重复的后续行
方案2:如果phone列有包含多个号码的列表
如果你的数据里存在一个列表对应多个号码的情况,我们可以把列表转换成元组(tuple)——元组是不可变的、可哈希的,这样就能直接用来检测重复了:
# 处理多元素列表的情况 df['phone_tuple'] = df['phone'].apply(lambda x: tuple(x) if isinstance(x, list) else x) # 查找重复 duplicate_phones = df[df['phone_tuple'].duplicated(keep=False)]
比如如果有一行的phone是[8866155845, 8866123456],转换成元组(8866155845, 8866123456)后,就能正常检测重复了。
额外提示:提前避免这类问题
如果是你自己生成的这个DataFrame,建议一开始就不要把单个号码存成列表,直接存数值或字符串类型,这样后续操作会更顺畅:
# 优化后的DataFrame创建方式 df = pd.DataFrame( [ ["John Muller", "person", 8866155845], ["Innovation Division", "company", np.nan], ["Carol Sway", "person", 8866155845], ], columns=["name", "kind", "phone"], )
这样直接用df[df['phone'].duplicated(keep=False)]就能找到重复的电话号码了。
内容的提问来源于stack exchange,提问作者Lucia Commerz
相关产品推荐
相关产品推荐

