Pandas执行drop_duplicates报unhashable type: 'list'错误如何解决
报错原因说明
- 你用错了方法:
drop_duplicates的作用是删除不同行之间取值重复的条目,但你的需求是删除同一行内years和line_items两个列取值完全相等的行,二者逻辑完全不匹配。 - 就算你需要用
drop_duplicates处理存列表的列,也会因为列表是可变、不可哈希的类型,无法参与哈希比较触发报错,这就是你看到TypeError: unhashable type: 'list'的原因。
解决方法
直接用布尔索引过滤掉两列相等的行即可,逐行比较两个列表的取值是否一致:
import pandas as pd # 构造示例df df_dict = {'years': {0: ['2019', '2018'], 1: ['2020', '2019'], 2: ['2019', '2018'], 3: ['2019', '2018'], 4: ['2020']}, 'line_items': {0: ['5709', '5795'], 1: ['1759669', '1578624'], 2: ['2019', '2018'], 3: ['1487', '1314'], 4: ['2020']}} df = pd.DataFrame(df_dict) # 过滤掉同一行years和line_items相等的行 df = df[df.apply(lambda row: row['years'] != row['line_items'], axis=1)]
运行后得到的df会自动排除索引为2、4的行,完全符合你的需求。如果数据量较大,可以先把两列的列表转为可哈希的元组再比较,性能会更好:
df = df[df['years'].apply(tuple) != df['line_items'].apply(tuple)]
内容的提问来源于stack exchange,提问作者geds133
相关产品推荐
相关产品推荐

