将字典列表转换为数据框

我有大量的 json 数据被读入 python 数据帧,并为每行创建一个字典列表。我需要将其转换为不同格式的数据。


数据格式如下:


{

    "data": [{

            "item": [{

                    "value": 0,

                    "type": "a"

                },

                {

                    "value": 0,

                    "type": "b"

                },

                {

                    "value": 70,

                    "type": "c"

                }

            ],

            "timestamp": "2019-01-12T04:52:06.669Z"

        },

        {

            "item": [{

                    "value": 30,

                    "type": "a"

                },

                {

                    "value": 0,

                    "type": "b"

                }

            ],

            "timestamp": "2019-01-12T04:53:06.669z"

        }

    ]

}

将数据转换为以下形式的数据帧的最有效方法是什么:


时间戳-----------------------------a-------b------c


2019-01-12T04:52:06.669Z------0-------0------70

2019-01-12T04:53:06.669Z------30- -----0------0


到目前为止,我已经设法使用 for 循环来做到这一点,但它非常低效且缓慢。到目前为止我所拥有的是这个。


with open('try.json') as f:

    data = json.load(f)


df_data = pandas.DataFrame(data['data'])

df_formatted = pandas.DataFrame(columns=['a','b','c'])


for d, timestamp in zip(df_data['item'], df_data['timestamp']):

    row = dict()

    for entry in d:

        category = entry['type']

        value = entry['value']

        row[category] = value

    row['timestamp'] = timestamp

    df_formatted = df_formatted.append(row, ignore_index=True)

df = df_formatted.fillna(0)

列表中的项目数通常为数千。有关如何高效执行此操作的任何指示或示例?


ITMISS
浏览 209回答 2
2回答

holdtom

您可以通过迭代对象来解压嵌套的 json 对象。尝试import pandas as pda=[      {       "item": [          {            "value": 0,            "type": "a"          },          {            "value": 0,            "type": "b"          },          {            "value": 70,            "type": "c"          },        ],        "timestamp": "2019-01-12T04:52:06.669Z"     },     {        "item": [          {            "value": 30,            "type": "a"          },          {            "value": 0,            "type": "b"          }        ],        "timestamp": "2019-01-12T04:53:06.669z"      }]cols = ['value', 'type', 'timestamp']rows = []for data in a:    data_row = data['item']    timestamp = data['timestamp']    for row in data_row:        row['timestamp']=timestamp        rows.append(row)df = pd.DataFrame(rows)df =df.pivot_table(index='timestamp',columns=['type'],values=['value']).reset_index()df.columns=['timestamp','a','b','c']如果您正在寻找紧凑的解决方案,请使用json_normalizefrom pandas.io.json import json_normalizedf =pd.DataFrame()for i in range(len(a)):    df =pd.concat([df,json_normalize(a[i]['item'])])df =df.pivot_table(index='timestamp',columns=['type'],values=['value']).reset_index()df.columns=['timestamp','a','b','c']最终输出timestamp                   a       b       c2019-01-12T04:52:06.669Z    0.0     0.0     70.02019-01-12T04:53:06.669z    30.0    0.0     NaN

素胚勾勒不出你

您可以从 json 中提取字典列表并将其提供给数据帧。代码可以是:df = pd.DataFrame([dict([('timestamp', d['timestamp']), ('a', 0),                         ('b', 0), ('c', 0)]                        + [(item['type'], item['value'])                           for item in d['item']])for d in data['data']],                  columns=['timestamp', 'a', 'b', 'c'])print(df)按预期输出:                  timestamp   a  b   c0  2019-01-12T04:52:06.669Z   0  0  701  2019-01-12T04:53:06.669z  30  0   0这里的技巧是首先构建一个具有默认值的对列表,然后在从中构建字典之前用实际值扩展它。由于保留了最后看到的值,您实际上构建了一个包含所有相关值的字典。columns 参数仅用于确保列的预期顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python