pandas:类型错误:不可哈希类型:'list'

6
我有以下的df
df = pd.DataFrame(
    [
        [["John Muller"], "person", [8866155845]],
        [["Innovation Division"], "company", np.nan],
        [["Carol Sway"], "person", [8866155845]],
    ],
    columns=["name", "kind", "phone"],
)

# Out:
#                     name     kind         phone
# 0          [John Muller]   person  [8866155845]
# 1  [Innovation Division]  company           NaN
# 2           [Carol Sway]   person  [8866155845]

我希望能够找到电话号码的重复内容。但是在df中,对象是列表形式,因此使用以下方式:

df.duplicated('phone') 

会产生错误:

TypeError: unhashable type: 'list'

1
可能这个链接会有帮助:https://dev59.com/dKbja4cB1Zd3GeqPd0YX - Georgy
下面的回答有帮到您吗?请放心接受一个答案(左侧的绿色勾号),或者要求澄清。 - jpp
5个回答

4
你可以使用 applymap 函数来解决这个问题,它非常方便:
# get duplicated row
df2 = df[df.applymap(lambda x: x[0] if isinstance(x, list) else x).duplicated('phone')]

print(df2)

           name    kind         phone
2  [Carol Sway]  person  [8866155845]

如果我们既有列表(list)又有字典(dict),我们能否在两个if条件下使用applymap?谢谢! - mOna
如果您有包含多个值的数组,可以将它们转换为元组,这些元组是可哈希的:applymap(lambda x: tuple(x) if isinstance(x, list) else x) - Opsse

2
您会惊讶地发现,与 pd.Series.duplicated 相比,pd.DataFrame.duplicated 的工作方式是不同的。您是正确的,df.duplicated("phone") 会抛出 TypeError,但直接使用 df.phone.duplicated() 将会成功。
df[df.phone.duplicated()]  # or df[df["phone"].duplicated()]

#           name    kind         phone
# 2  [Carol Sway]  person  [8866155845]

另一个简单实用的方法是使用 explode 方法来处理 DataFrame 中的列表对象,该方法将类似列表的元素转换为行(但请注意它会复制索引)。您可以按照以下方式使用它:

df_exploded = df.explode("phone")
df_exploded[df_exploded.duplicated("phone")]

#            name    kind       phone
# 2  [Carol Sway]  person  8866155845

如果你只对重复的电话号码感兴趣,你可以像这样做:df["phone"].explode().value_counts(),以查看特定号码重复的次数。


1
您可以使用hashable_df包:
from hashable_df import hashable_df
hashable_df(df).duplicated('phone')

这将使所有不可哈希的单元格值变得可哈希,并使这些类型的操作起作用。

0

将您的单项列表系列转换为标量系列。由于有时会出现NaN,因此您可以使用自定义的lambda函数。

for col in ['name', 'phone']:
    df[col] = df[col].apply(lambda x: next(iter(x)) if isinstance(x, list) else x)

这将使您的系列项目可哈希,并使您能够使用pd.DataFrame.duplicated


0

我们可以从这个错误中推断出,df.duplicated 使用 set 来确定重复项,因此系列中的所有对象都必须是可哈希的。列表是不可哈希的。

检查您的数据框,每个 namephone 都是一个包含单个字符串的列表。

为什么?如果没有足够好的理由(即,每行永远不会有多个名称和电话),请将它们转换为字符串,或者从一开始就创建它们为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接