Python 将多个group by转换为json
我在将以下数据帧转换为JSON结构时遇到了一些问题。我试过几件事,但都没能做到最后一点。 因此,我有一个数据框架,包括以下内容Python 将多个group by转换为json,python,json,pandas,Python,Json,Pandas,我在将以下数据帧转换为JSON结构时遇到了一些问题。我试过几件事,但都没能做到最后一点。 因此,我有一个数据框架,包括以下内容 serialNumber | date | part | value | name --------------|------------|-------|-------|---------------- ABC0001 | 01/10/2019 | Part1 | ABC1 | ABC ABC0001
serialNumber | date | part | value | name
--------------|------------|-------|-------|----------------
ABC0001 | 01/10/2019 | Part1 | ABC1 | ABC
ABC0001 | 01/10/2019 | Part1 | ABC2 | XYZ
ABC0001 | 02/10/2019 | Part2 | ABC3 | ASF
ABC0001 | 02/10/2019 | Part2 | ABC4 | TSR
需要它的格式是
{ "SerialNumber": "ABC001",
"detail": [ { "part": "Part1",
"date":"01/10/2019",
"extras": [ { "value": "ABC1",
"name": "ABC"
},
{ "value": "ABC2",
"name": "XYZ"
}]
},
{ "part": "Part2",
"date":"02/10/2019",
"extras": [ { "value": "ABC3",
"name": "ASF"
},
{ "value": "ABC4",
"name": "TSR"
}]
]
}
所以分组序列号,然后是数据和部分,然后是值和名称。
我看了一些答案,最后一个答案帮助很大
df.groupby(['serialNumber', 'Part']).apply(
lambda r: r[['Value', 'identifierName']].to_dict(orient='records')
).unstack('serialNumber').apply(lambda s: [
{s.index.name: idx, 'detail=': value}
for idx, value in s.items()]
).to_json(orient='records')
这让我
[
{
"ABC0001":{
"Part":"Part1",
"detail=":[
{
"Value":"ABC1",
"identifierName":"ABC"
},
{
"Value":"ABC2",
"identifierName":"XYZ"
}
]
}
},
{
"ABC0001":{
"Part":"Part2",
"detail=":[
{
"Value":"ABC3",
"identifierName":"ASF"
},
{
"Value":"ABC4",
"identifierName":"TSR"
}
]
}
}
]
但是当我添加日期时出现故障,并且没有显示序列号标签
建议??提示?熊猫中没有解决此问题的默认函数 该嵌套代码在
MultIndex
的每一层进行迭代,将层添加到字典中,直到最深的层被分配给系列
值
这将适用于任意数量的嵌套折叠:
grouped=df.set_索引(['serialNumber','Part'])
感谢更新,我刚刚运行了一个测试,得到了“DataFrameGroupBy”对象的“无法访问可调用属性”itertuples,尝试使用“应用”方法“我只是将csv文件读入一个dataframe,然后运行上面的代码?建议?是的,我理解问题并解决了它。对不起,还有一个,我;我尝试过调试它,现在得到了ValueError:太多的值无法解包(预期为2)@Jonee哪一行?对于索引,值在grouped.itertuples()中
import json
levels = grouped.ndim
dicts = [{} for i in range(levels)]
last_index = None
for index,value in enumerate(grouped.itertuples(), 1):
if not last_index:
last_index = index
for (ii,(i,j)) in enumerate(zip(index, last_index)):
if not i == j:
ii = levels - ii -1
dicts[:ii] = [{} for _ in dicts[:ii]]
break
for i, key in enumerate(reversed(index)):
dicts[i][key] = value
value = dicts[i]
last_index = index
result = json.dumps(dicts[-1])