You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:36:03