将嵌套的键/值和嵌套列表合并到 json

Posted

技术标签:

【中文标题】将嵌套的键/值和嵌套列表合并到 json【英文标题】:Merge nested key/values and nested list into a json 【发布时间】:2019-08-15 18:43:42 【问题描述】:

我正在尝试将字典键/值的嵌套列表合并到单个键和值列表中。我正在将 csv 文件加载到数据框中,并尝试将其转换为嵌套的 json。请看下面我已经尝试过了。我应该走这条路线来创建 json 还是 pandas 具有执行这种类型转换的本机功能?

样本数据:

Subject,StudentName,Category
ENGLISH,Jane,
ENGLISH,,A
MATH,Matt,B
MATH,Newman,AA
MATH,,B
MATH,Dylan,A
ENGLISH,Noah,
ENGLISH,,C

试过这个:

df1 = pd.read_csv('../data/file.csv')
json_doc = defaultdict(list)
for _id in df1.T:
    data = df1.T[_id]
    key = data.Subject
    values = 'StudentName': data.StudentName,'Category':data.Category
    json_doc[key].append(values)

new_d = json.dumps(json_doc, indent=4)

k: int(v) for k, v in new_d # error: ValueError: not enough values to unpack (expected 2, got 1)

我从上面的代码中得到了这个:


    "ENGLISH": [
        
            "StudentName": "Jane",
            "Category": NaN
        ,
        
            "StudentName": NaN,
            "Category": "A"
        ,
        
            "StudentName": "Noah",
            "Category": NaN
        ,
        
            "StudentName": NaN,
            "Category": "C"
        
    ],
    "MATH": [
        
            "StudentName": "Matt",
            "Category": "B"
        ,
        
            "StudentName": "Newman",
            "Category": "AA"
        ,
        
            "StudentName": NaN,
            "Category": "B"
        ,
        
            "StudentName": "Dylan",
            "Category": "A"
        
    ]

如何合并键/值以使其看起来像这样?


    "ENGLISH": [
        
            "StudentName": ["Jane","Noah"],
            "Category": ["A","C"]
        
    ],
    "MATH": [
        
            "StudentName": ["Matt","Newman","Dylan"]
            "Category": ["B","AA","A"]
        
    ]

【问题讨论】:

【参考方案1】:

我并不完全清楚忽略缺失值是否安全,但这是我的单行:

df.groupby('Subject').agg(lambda g: list(g.dropna())).to_dict(orient='index')

默认方法(to_json、to_dict)没有合适的orient 选项。因此,我们必须通过按索引分组然后将列数据转换为列表来手动完成一些工作。然后,.to_dict(orient='index') 会做你想做的事(如果你想要一个字符串而不是一个对象,请替换为 to_json)。

注意:Subject 此处应为列,而不是索引。

【讨论】:

以上是关于将嵌套的键/值和嵌套列表合并到 json的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的键规范化嵌套的 json

Spring Boot 嵌套动态 json 请求映射到 pojo

将新的键/值对添加到 PostgreSQL JSON 列内的嵌套数组中

获取以索引为导向的嵌套字典中的键和值列表

jQuery 树遍历 - 将无序列表元素嵌套到 JSON

React:将嵌套的 json 数据与父数据合并以创建多个对象