【问题标题】:Reading a JSON File into a dataframe WITHOUT using the json module不使用 json 模块将 JSON 文件读入数据帧
【发布时间】:2018-05-20 16:59:29
【问题描述】:

我有一个大型 json 文件,我需要在不使用 json 模块的情况下将其读入 pandas 数据框。这是文件melbourne_bike_share.json 的链接。我不知道要删掉什么来做一个最小的例子。

我尝试从读取文件到数据帧的每一种方式,都会遇到同样的错误:

ValueError: Mixing dicts with non-Series may lead to ambiguous ordering.

我试过直接阅读:

import pandas as pd
mbs = pd.read_json('Melbourne_bike_share.json')

并确保 pd.read_json() 读取的字符串是正确的:

with open("Melbourne_bike_share.json", encoding="utf8") as mbs_json:
    mbs_string = mbs_json.readlines()
    mbs_string = [line.rstrip() for line in mbs_string]
    mbs_string = ''.join(mbs_string)

mbs = pd.read_json('Melbourne_bike_share.json')

但仍然得到相同的 ValueError。我找不到导致此错误的原因,它的真正含义,或者几乎所有涉及读取 json 文件的问题,这些问题不只是建议使用 json 模块,而我无法做到。

我是 python 和 json 文件的新手。据我所知,在能够读取 json 文件之后,下一步就是将其展平:

from pandas.io.json import json_normalize    
df = json_normalize(mbs)

之后,我将拥有我的数据框并可以对其进行操作。

编辑后显示结果数据帧的预期第一行。 第一行是列标题(默认索引,直到我弄清楚如何从 json 文件中的元数据中提取列标题)。我将列标题间隔 0-5 以与它们的值对齐,之后,此处的格式将它们放在新行上。对于那个很抱歉。希望你能看到它们都应该对齐。 第二行是第一行。

    0   1                                       2   3           4       5    6  7   8   9   10  11  12  13  14
0   155 7C09387D-9E6C-4B42-9041-9A98B88F54BB    155 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   2   Harbour Town - Docklands Dve - Docklands    60000   9   14  1453985105  [{"address":"","city":"","state":"","zip":""},..

任何帮助将不胜感激。

【问题讨论】:

  • 你有一个你希望输出看起来如何的例子
  • 此数据似乎与多个列表嵌套得很深。我不确定它是否是为简单消费而设计的。此数据的 csv 格式可在 data.gov.au/dataset/… 获得
  • 我对其进行了编辑并放入了一个输出示例。是的,这个 json 文件是作为第一次了解 json 文件是什么以及如何解析它们而提供的。我同意这似乎过于复杂,特别是考虑到我们不允许使用 json 模块。

标签: json python-3.x pandas dataframe


【解决方案1】:

我认为您正在寻找这样的东西:

import pandas as pd

df = pd.read_json('Melbourne_bike_share.json', typ='series')
pd.DataFrame(data=df['data'])

0   1   2   3   4   5   6   7   8   9   10  11  12  13  14
0   155 7C09387D-9E6C-4B42-9041-9A98B88F54BB    155 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   2   Harbour Town - Docklands Dve - Docklands    60000   9   14  1453985105  [{"address":"","city":"","state":"","zip":""},...
1   156 52739A59-E034-436B-A613-E7A5F62448C0    156 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   4   Federation Square - Flinders St / Swanston St ...   60001   11  11  1453985105  [{"address":"","city":"","state":"","zip":""},...
2   157 7EFB5219-2764-47CE-A497-B6D872823BBE    157 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   5   Plum Garland Reserve - Beaconsfield Pde - Albe...   60002   16  1   1453985105  [{"address":"","city":"","state":"","zip":""},...
3   158 4B09D743-FFEE-4185-B968-A7866E45FE0B    158 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   6   State Library - Swanston St / Little Lonsdale ...   60003   9   2   1453985105  [{"address":"","city":"","state":"","zip":""},...
4   159 C5493850-5714-40E2-9A67-DA443A4F64F8    159 1428899388  880594  1453945520  880594  {\n "invalidCells" : {\n "27624917" : "22/...   7   Bourke Street Mall - 205 Bourke St - City   60004   10  1   1453985105  [{"address":"","city":"","state":"","zip":""},...

如果要添加列名,请执行以下操作:

import pandas as pd

mbs = pd.read_json('Melbourne_bike_share.json', typ='series')
mbs_columns = mbs['meta']['view']['columns']
names = [item['name'] for item in mbs_columns]
df = pd.DataFrame(data=mbs['data'],columns=names)

【讨论】:

  • 这行得通!谢谢!!好的,1)我应该使用 typ = 'Series'。 2)当您定义“mbs_columns”时,我理解您为什么包含 ['meta'] 和 [view'],而不是 ['columns']。
  • 因为我们想要键 'columns' 中项目 'name' 的值
猜你喜欢
  • 2021-03-27
  • 2023-03-25
  • 2021-08-22
  • 2020-08-27
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多