【问题标题】:Drop duplicate row with dicts删除带有字典的重复行
【发布时间】:2015-10-20 10:31:20
【问题描述】:

我从json读取数据,其中一些是重复的,所以我想删除它们,请注意有2列(douban_infoomdb_info)仍然是json/dict格式

但是,如果我这样做pd_data.drop_duplicates(['douban_info'])(带有 json 内容的列),它会失败。

但如果我使用pd_data.drop_duplicates(['detail_url'])(常规专栏),它会起作用。

那么如何才能成功删除这些重复项??

例外:

TypeError                                 Traceback (most recent call last)
<ipython-input-13-a0091f87b553> in <module>()
      1 pd_data.drop_duplicates(['detail_url']) # this works
----> 2 pd_data.drop_duplicates(['douban_info']) # this failed
      3 # pd_data2.describe()

...

TypeError: unhashable type: 'dict'

注意:data file 可以放在哪里?那你可以试试吗?

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    TypeError: unhashable type: 'dict' 表示您在尝试用于drop_duplicates 的列中有一个字典。

    drop_duplicates 需要能够将列中的值相互比较,它通过散列来做到这一点,并且您不能将 dict 转换为散列。

    因为只有当两个值相等时才能确定一行是否重复。

    你需要做的就是把这个 dict 改成可散列的东西。也许是一个字符串。

    pd_data['douban_info_string'] = pd_data['douban_info'].astype(str)
    pd_data.drop_duplicates('douban_info_string')
    

    应该可以。

    不是很高效或漂亮,但应该可以。

    【讨论】:

    • 我觉得这是pandas的一个缺点。您没有理由只想删除可哈希列的重复项。
    • 这不是熊猫的问题。这是一个python问题。除非您可以散列一个值,否则您不能将其等同于另一个值。当遮盖 eq 方法时,您还需要遮盖 hash 方法。对于不存在的值,无法检测到重复项。
    • 如何将字符串转回dict?
    • @Miffy 如果你做了我上面写的,你就不能(以任何方便的方式)。您应该改为使用 dicts 和 json 序列化它们。 df['dicts'].apply(json.dumps) 并将它们转换回 df['strings'].apply(json.loads) 但是为什么你不只保留原来的 dicts,我猜,这是一个长篇大论?
    • @Miffy 然后在转换之前将列表复制到新列中,保留原件。此外,您可能需要考虑列表的排序顺序,甚至可以将它们组合成集合。如果你还没有。
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 2019-09-26
    • 2010-12-21
    • 2022-11-27
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多