如果在大 JSON 数据中发现类似的特定键,如何删除嵌套数据?

Posted

技术标签:

【中文标题】如果在大 JSON 数据中发现类似的特定键,如何删除嵌套数据?【英文标题】:How can I remove a nested data If a specific key found similar in big JSON data? 【发布时间】:2022-01-24 03:23:59 【问题描述】:

过滤的简单方法是将它们全部循环,但请相信我,因为我有非常大量的数据循环非常耗时,而且可能不是非常有效的方法,

 [
  
    "from_name": "Haio",
    "from_id": 183556205,
    "receiver_name": "Shubh M",
    "targeted_id": 78545445,
    "gift_value": '$56'
  ,
  
    "from_name": "Mr. A",
    "from_id": 54545455,
    "receiver_name": "haio",
    "targeted_id": 78545445,
    "gift_value": '$7'
  ]

我想完成什么?

如果targeted_id相同,我只想删除字典

【问题讨论】:

你能展示一下你试过的循环,哪个太慢了吗? 那么在这种情况下,您是要删除两个条目,因为它们具有相同的 targetid 还是只有其中一个?如果只有其中一个,你想保留哪一个?你最终只想要一个不同的 targetid 列表吗? 您的数据来源是什么?它是一个文件,你想写一个新文件吗?您要“就地”删除重复项还是要创建一个没有重复项的新列表? “大量”是什么意思? 【参考方案1】:

如果您可以将整个数据集加载到内存中,请使用 pandas 和 drop_duplicates。默认情况下,它将保留每组重复记录中的第一个。创建数据帧会产生一些开销,但如果要处理大量记录,那么以这种方式删除重复项应该比 python 循环快得多。

import pandas as pd
data =[
  
    "from_name": "Haio",
    "from_id": 183556205,
    "receiver_name": "Shubh M",
    "targeted_id": 78545445,
    "gift_value": '$56'
  ,
  
    "from_name": "Mr. A",
    "from_id": 54545455,
    "receiver_name": "haio",
    "targeted_id": 78545445,
    "gift_value": '$7'
  ]
df = pd.DataFrame(data).drop_duplicates(subset=['targeted_id'])
print(df.to_json()) # or specify a file name to save it

【讨论】:

【参考方案2】:
def remove_duplicates(lst, key=lambda x: x, acc=[], keys = []):
    if lst == []:
        return acc
    elif key(lst[0]) in keys:
        return remove_duplicates(lst[1:], key=key, acc=acc, keys=keys)
    else:
        return remove_duplicates(lst[1:], key=key, acc = acc + [lst[0]], keys=keys + [key(lst[0])])
```

【讨论】:

由于数据被认为是“巨大的”,我认为任何基于递归的解决方案都行不通。

以上是关于如果在大 JSON 数据中发现类似的特定键,如何删除嵌套数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ijson 从特定键读取 json 数据

如何使用特定键获取模型对象

聚合 json 数组中特定键的值 - PostgreSQL

如何在大数据中进行模糊搜索

如何在大数据上找到类似的模式以及缺失的实体?

如何使用 Node.js 将特定键:Json 的值插入到 postgres 表中