具有数据框或 Excel 文件的重复键的 JSON 文件

Posted

技术标签:

【中文标题】具有数据框或 Excel 文件的重复键的 JSON 文件【英文标题】:JSON file with duplicate keys to a dataframe or excel file 【发布时间】:2022-01-10 16:35:17 【问题描述】:

我有一个巨大的 JSON 文件,每个对象中有重复的键,简化示例:

[ 
  
   "a": 3,
   "b": "Banana",
   "c": 45,
   "a": 3,
   "a": 8,
   
]

当然,我的数据有更多的键和对象,但这是一个很好的 sn-p。 我希望它看起来像这样:

|a|   b  |c |
-------------
|3|Banana|45|
|3|Banana|45|
|8|Banana|45|

我不挑剔,excel、R、python 上的任何东西......但我见过的所有 json 解析器都不允许这样的重复。

我已经搜索了很多,但我没有找到答案。有什么方法可以做到这一点而不必手动进行吗?数据集是巨大的。 PS我知道json有多个重复键是不利的。键名和值都有重复项,我需要所有这些,但我是通过这种方式获得文件的。

【问题讨论】:

【参考方案1】:

这是一个 R 解决方案。

前提:部分un-jsonify成重名列表,单独转成帧,再聚合成一帧。

我会稍微扩充一下数据,以证明不止一本字典:

json <- '[ 
  
   "a": 3,
   "b": "Banana",
   "c": 45,
   "a": 3,
   "a": 8
   , 
   
   "a": 4,
   "b": "Pear",
   "c": 46,
   "a": 4,
   "a": 9
   
 ]'

代码如下:

L <- jsonlite::fromJSON(json, simplifyDataFrame=FALSE)
L2 <- lapply(L, function(z) as.data.frame(split(unlist(z, use.names=FALSE), names(z))))
do.call(rbind, L2)
#   a      b  c
# 1 3 Banana 45
# 2 3 Banana 45
# 3 8 Banana 45
# 4 4   Pear 46
# 5 4   Pear 46
# 6 9   Pear 46

【讨论】:

第二行 (L2) 出现此错误: (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply不同的行数:1、2、3、4、131、130、5 另外:警告消息:在 split.default(unlist(z, use.names = FALSE), names(z)) 中:(函数中的错误(..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 参数暗示不同的行数:1, 2, 3, 4, 131, 130, 5 是的,这表明您的数据可能比您的样本数据所暗示的更加多样化。如果您的任何“dupe-name”条目有(比如说)2 个和 3 个,那么正常的回收(以 as.data.frame 部分为前提)将不起作用。 您在 OP 中的“预期输出”建议对值进行简单的回收,如果我的假设是正确的,这将不再起作用。如果您可以找到导致失败的字典,并确定您希望该不合规字典如何解决,请更新您的 OP。【参考方案2】:

也许我可以帮助解决重复键的问题,它们是主要问题,IMO。

在 Python 中,有一种方法可以处理 JSON 中的重复键。您可以定义一个自己的“钩子”来处理键:值对。

在您的示例中,键“a”出现了 3 次。这是一个演示,它通过附加连续数字“_1”、“_2”、“_3”等来为所有这些多个键提供唯一名称。(如果名称可能与现有键(如“a_1”)发生冲突,请更改命名格式。)

结果是一个有效的字典,你可以随意处理。

import collections
import json

data = """ 
[ 
  
   "a": 3,
   "b": "Banana",
   "c": 45,
   "a": 3,
   "a": 8
   
]
"""

def object_pairs(pairs):
    dups = d:1 for d, i in collections.Counter(pair[0] for pair in pairs).items() if i > 1
    #       ^^^ change to d:0 for zero-based counting
    dedup = 
    for k, v in pairs:
        try:
            num = dups[k]
            dups[k] += 1
            k = f"k_num"
        except KeyError:
            pass
        dedup[k] = v 
    return dedup

result = json.loads(data, object_pairs_hook=object_pairs)
print(result) # ['a_1': 3, 'b': 'Banana', 'c': 45, 'a_2': 3, 'a_3': 8]

【讨论】:

谢谢!这实际上可以帮助我将所有数据加载到 DF 中,然后将其下载为 excel 文件。我编辑了我的帖子,因为我不好,我确实忘记了逗号。

以上是关于具有数据框或 Excel 文件的重复键的 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 中有没有一种方法可以从具有复合主键的 Excel 文件中导入?

Excel 中的 JSON 重复输入部分

将字符串转换为具有重复键的对象到数组

将反序列化的 JSON 对象保存到具有重复子实体的数据库

使用 jq 将嵌套的 JSON 文件分解为具有唯一键的平面列表

具有多个键的熊猫数据框到 json