我有一个df:
name kind phone
0 [John Muller] person [8866155845]
1 [Innovation Division] company NaN
2 [Carol Sway] person [8866155845]
我希望找到电话号码的副本并合并行。但是df中的对象是list,所以使用:
df.duplicated('phone')
将生成TypeError:unhashable类型:' list'
答案 0 :(得分:1)
你也可以使用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]
答案 1 :(得分:0)
我们可以从此错误中推断df.duplicated
正在使用set
来确定重复项,因此系列中的所有对象都必须是可清除的。列表不可用。
检查您的数据框,每个name
和phone
都是一个包含单个字符串的列表。
为什么呢?如果没有足够好的理由(即,每行永远不会有多个名称和电话)转换为字符串,或者从第一个位置创建字符串。
答案 2 :(得分:0)
将您的一系列单项列表项转换为一系列标量。由于有时您有@x: ~"solid 1px";
.res (@border)
{
border-top: @x;
border-left: @x;
border-right: @x;
border-bottom: @x;
}
.border-top{
.res (@x);
.border-left{
.res (@x);
}
}
,因此您可以使用自定义NaN
功能。
lambda
这会使您的系列项目可以播放,并允许您使用for col in ['name', 'phone']:
df[col] = df[col].apply(lambda x: next(iter(x)) if isinstance(x, list) else x)
。
答案 3 :(得分:0)
使用可以使用:
from hashable_df import hashable_df
hashable_df(df).duplicated('phone')
这将使所有不可哈希的单元格值可哈希化,并且此类操作将起作用。