含JSON列的DataFrame分组去重优化方案咨询
解决方案
你的现有方案是可行的,但不算最优——序列化和反序列化JSON会带来额外性能开销,数据量越大越明显。这里有几种更高效的替代方式:
将字典转为可哈希的结构:字典不可哈希,但元组可以。可以把字典(包括嵌套的)递归转为排序后的元组,保证相同内容的字典生成相同的元组:
def dict_to_hashable(obj): if isinstance(obj, dict): # 排序键值对,避免键顺序不同导致哈希不同 return tuple(sorted((k, dict_to_hashable(v)) for k, v in obj.items())) elif isinstance(obj, list): return tuple(dict_to_hashable(item) for item in obj) else: return obj # 生成可哈希的列 df["json_hash"] = df["json"].apply(dict_to_hashable) # 分组聚合 result = df.groupby(["key", "json_hash"])["val"].apply(list).reset_index() # 可选:将哈希结构转回原始字典 result["json"] = result["json_hash"].apply(lambda x: dict(x) if isinstance(x, tuple) else x)这种方式完全避开了JSON序列化的开销,性能更优。
用pandas内置哈希工具:直接用
pd.util.hash_pandas_object对JSON列生成哈希值,以此作为分组键:df["json_hash"] = pd.util.hash_pandas_object(df["json"], index=False) # 分组聚合 result = df.groupby(["key", "json_hash"])["val"].apply(list).reset_index() # 合并回原始JSON列(去重后保留唯一值) result = result.merge(df[["json_hash", "json"]].drop_duplicates(), on="json_hash")这种方式代码简洁,实现快速,适合大多数场景。
提取JSON内的唯一标识(如果有):如果你的JSON结构固定,且存在唯一标识字段(比如employees列表的唯一ID、某个固定特征),可以直接用这些字段作为分组键,不需要处理整个JSON。这是性能最好的方式,但依赖JSON的结构特性。
总结:数据量小时,你的现有方案完全够用;数据量大时,优先选择哈希化字典或hash_pandas_object的方式,避免JSON序列化的额外开销。
内容的提问来源于stack exchange,提问作者mrgou
相关产品推荐
相关产品推荐

