为了账号安全,请及时绑定邮箱和手机立即绑定

将字典列表转换为数据框

将字典列表转换为数据框

ITMISS 2021-11-09 10:46:01
我有大量的 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------c2019-01-12T04:52:06.669Z------0-------0------702019-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)列表中的项目数通常为数千。有关如何高效执行此操作的任何指示或示例?
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

您可以通过迭代对象来解压嵌套的 json 对象。尝试


import pandas as pd

a=[

      {

       "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_normalize


from pandas.io.json import json_normalize

df =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       c

2019-01-12T04:52:06.669Z    0.0     0.0     70.0

2019-01-12T04:53:06.669z    30.0    0.0     NaN


查看完整回答
反对 回复 2021-11-09
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以从 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   c

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

1  2019-01-12T04:53:06.669z  30  0   0

这里的技巧是首先构建一个具有默认值的对列表,然后在从中构建字典之前用实际值扩展它。由于保留了最后看到的值,您实际上构建了一个包含所有相关值的字典。


columns 参数仅用于确保列的预期顺序。


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号