我不认为你可以通过直接调用 pandas 函数来完成你所需要的。您可能必须事先重新格式化您的数据。JSON 模块可以帮助您操作原始数据,将其视为原生 Python 列表和字典,以定义和填充第二个“清理过的”字典,然后您可以传入pandas.DataFrame
.
从 JSON 文件的字符串表示开始s
,您可以将其转换为字典列表。
contents = json.loads(s)
您的data3
变量似乎已经采用这种格式。它是一个字典列表。
如果我理解正确,您希望您的数据框列对应于“名称”字段,并且要使用“值”字段填充行。data3
包含许多字典,因此每个将对应一行。为了为您开发工作代码,我创建了一个愚蠢的示例,希望能够模仿您所拥有的。
s = """
[
{
"frame_type": "data_message",
"name": "record",
"header": {
"local_mesg_num": 3,
"time_offset": null,
"is_developer_data": false
},
"fields": [
{
"name": "x1",
"value": "xx",
"units": "xx",
"def_num": 1,
"raw_value": 1
},
{
"name": "x2",
"value": "xx",
"units": "xx",
"def_num": 2,
"raw_value": 2
},
{
"name": "x3",
"value": "xx",
"units": "xx",
"def_num": 3,
"raw_value": 3
}
]
},
{
"frame_type": "data_message",
"name": "record",
"header": {
"local_mesg_num": 3,
"time_offset": null,
"is_developer_data": false
},
"fields": [
{
"name": "x1",
"value": "xx",
"units": "xx",
"def_num": 1,
"raw_value": 1
},
{
"name": "x2",
"value": "xx",
"units": "xx",
"def_num": 2,
"raw_value": 2
},
{
"name": "x3",
"value": "xx",
"units": "xx",
"def_num": 3,
"raw_value": 3
}
]
}
, {
"frame_type": "data_message",
"name": "record",
"header": {
"local_mesg_num": 3,
"time_offset": null,
"is_developer_data": false
},
"fields": [
{
"name": "x1",
"value": "xx",
"units": "xx",
"def_num": 1,
"raw_value": 1
},
{
"name": "x2",
"value": "xx",
"units": "xx",
"def_num": 2,
"raw_value": 2
},
{
"name": "x3",
"value": "xx",
"units": "xx",
"def_num": 3,
"raw_value": 3
}
]
}]
"""
data3 = json.loads(s) # emulating your data3 variable
实例化一个空字典并开始填写你想要的东西。这个 dict 将被传递给pd.DataFrame()
.
reformatted_data = {} # instantiate
首先,使用第一个字典来定义数据框的列。
for thing in data3[0]:
for field in thing["fields"]:
reformatted_data[field["name"]] = [] # instantiate columns
然后填充行
for thing in data3:
for field in thing["fields"]:
reformatted_data[field["name"]].append(field["value"])
最后,获取数据框
df = pd.DataFrame(reformatted_data)
x1 x2 x3
0 xx xx xx
1 xx xx xx
2 xx xx xx