0

我正在尝试将一些 Strava 活动数据转换为 df 以进行一些分析。

典型的 json 顶部在所有文件中都是这样的:

{
    "frame_type": "data_message",
    "name": "record",
    "header": {
        "local_mesg_num": 3,
        "time_offset": null,
        "is_developer_data": false
    },
    "fields": [
        {
            "name": "xx",
            "value": "xx",
            "units": "xx",
            "def_num": xx,
            "raw_value": xx
        }
    ]
}

但是上面有很多信息,我不知道如何过滤掉。

在此处输入图像描述

我正在尝试这样做, df = pandas.json_normalize(data) 但它返回了这个:

在此处输入图像描述

本质上,我希望表输出为:

时间戳 position_lat position_long 距离 time_from_course ETC
第一的 数据 更多的 列也

等等

我对这一切都比较陌生,所以为菜鸟问题道歉......

4

1 回答 1

0

我不认为你可以通过直接调用 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
于 2021-04-20T22:45:50.813 回答