如何移除嵌套Pandas DataFrame中的重复项?
如何移除嵌套Pandas DataFrame中的重复项?
嘿,刚接触Pandas遇到这种嵌套数据的问题太正常了,我来帮你搞定这个去重难题!
你遇到的报错“unhashable dict”是因为Pandas默认的去重方法没法直接处理字典这种可变、不可哈希的类型,所以得先把嵌套的字典转成可哈希的格式,再进行去重操作。下面给你两种实用的解决方法,都能完美解决你的问题:
方法一:用JSON序列化字典(通用型,适合复杂嵌套)
我们可以把每个字典转换成JSON字符串——字符串是可哈希的,Pandas就能识别重复项了。具体代码如下:
import pandas as pd import json # 你的原始数据 data = { "some_id": "xxx", "some_email": "abc.xyz@somedomain.com", "This is Sample": [ {"a": "22", "b": "Y", "c": "33", "d": "x"}, {"a": "44", "b": "N", "c": "55", "d": "Y"}, {"a": "22", "b": "Y", "c": "33", "d": "x"}, {"a": "44", "b": "N", "c": "55", "d": "Y"}, {"a": "22", "b": "Y", "c": "33", "d": "x"}, {"a": "44", "b": "N", "c": "55", "d": "Y"} ] } df = pd.DataFrame(data) # 新增辅助列:把字典转成JSON字符串 df['dict_serialized'] = df['This is Sample'].apply(json.dumps) # 基于关键列+辅助列去重,之后删掉辅助列 df_unique = df.drop_duplicates(subset=['some_id', 'some_email', 'dict_serialized']).drop('dict_serialized', axis=1) print(df_unique)
运行后就能得到你想要的去重结果,而且原有的字典列完全保留,没有被修改。
方法二:把字典转为排序后的元组(轻量型,适合简单字典)
如果你的字典结构比较简单,没有更深的嵌套,也可以把字典的键值对转成排序后的元组——元组是不可变可哈希的,同样能帮Pandas识别重复:
import pandas as pd # 原始数据和DataFrame初始化同上,这里省略 df = pd.DataFrame(data) # 新增辅助列:将字典转为排序后的键值对元组 df['dict_tuple'] = df['This is Sample'].apply(lambda x: tuple(sorted(x.items()))) # 去重后删除辅助列 df_unique = df.drop_duplicates(subset=['some_id', 'some_email', 'dict_tuple']).drop('dict_tuple', axis=1) print(df_unique)
这里排序很重要哦,不然如果字典的键顺序不同(虽然内容一样),会被当成不同的元组,导致去重不彻底。
这两种方法都能解决你的问题,要是你的数据有更复杂的嵌套结构,优先选方法一,JSON序列化能处理绝大多数嵌套场景~
内容来源于stack exchange
相关产品推荐
相关产品推荐

