JSON字典列表从long到wid的Python函数转换

2024-05-03 17:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON对象,我正在尝试重新配置以进行不同的分析,并且我正在寻找一个函数转换,以便在两个唯一键控字段的基础上聚合一个字段。在

我的数据集如下所示:

myjson = 

[
{
"name": "Fred",
"class": "Algebra",
"topic" : "polynomials",
"extra" : "True"
},
{
"name": "Fred",
"class": "Algebra",
"topic" : "polynomial division",
"extra" : "False"
},
{
"name": "Fred",
"class": "Algebra",
"topic" : "solving",
"extra" : "True"
},
{
"name": "Willbert",
"class": "Dance",
"topic" : "Fancy",
"extra" : "False"
},
{
"name": "Willbert",
"class": "Dance",
"topic" : "Country",
"extra" : "True"
}
]

我想用Name和Class作为聚合topics字段的唯一键——如果“extra”字段的内容不同,我希望它们都保留与第一个条目相关联的数据——也就是说,它们不需要合并,而应该只从一个记录中取值。在

所以,我想把上面的内容变成:

^{pr2}$

甚至可以将主题串联在一起,如字符串:

[
{
"name": "Fred",
"class": "Algebra",
"topic" : "polynomials polynomial division solving"
},
{
"name": "Willbert",
"class": "Dance",
"topic" : "Fancy Country"
}
]

solved with groupby之前,我曾经有过一个类似的问题,但是对于如何开始这个问题有点不知所措,特别是现在我有两个键控条目,而不是只有一个。在

更新

我可以用一个键来启动,在这个例子中可以用。。。在

groups = itertools.groupby(myjson,lambda x: (x['name']))
[(k,list(g)) for k,g in groups]

但在我的实际数据集中,仅仅使用'name'是不足以消除歧义的——我需要按'name'和'class'进行分组

这不起作用:

groups = itertools.groupby(myjson,lambda x: (x['name'],x['class']))
[(k,list(g)) for k,g in groups]

更新2

Found this link solving a similar problem这说明对2个组的键控是非常重要的——这是真的有必要吗,还是有其他更熟悉itertools的人可以指出更好地使用groupby的方法?在


Tags: 数据nametruetopicfredextraclassgroups
1条回答
网友
1楼 · 发布于 2024-05-03 17:34:31

您可以使用字典按某个键进行分组:

data = {}
key = operator.itemgetter("name", "class")
for record in myjson:
    k = key(record)
    if k in data:
        data[k]["topic"].append(record["topic"])
    else:
        data[k] = record.copy()
        data[k]["topic"] = [record["topic"]]
result = data.values()

循环将输入列表转换为一个由所需键键入的字典,累积"topic"字段。因为我们在值中包含了键,所以我们可以简单地提取这些值以获得所需的结果。在

相关问题 更多 >