【问题标题】:Reading Json file as Pandas Dataframe error将 Json 文件读取为 Pandas Dataframe 错误
【发布时间】:2016-08-18 16:08:09
【问题描述】:

我有一个如下的 Json 文件。这是一个字典列表。

[{"city": "ab", "trips": 4, "date": "2014-01-25", "value": 4.7, "price": 1.1, "request_date": "2014-06-17", "medium": "iPhone", "%price": 15.4, "type": true, "Weekly_pct": 46.2, "avg_dist": 3.67, "avg_price": 5.0}, {"city": "bc", "trips": 0, "date": "2014-01-29", "value": 5.0, "price": 1.0, "request_date": "2014-05-05", "medium": "Android", "%price": 0.0, "type": false, "weekly_pct": 50.0, "avg_dist": 8.26, "avg_price": 5.0}.....]

当我读到这个时:

data=pd.read_json('dataset.json')

我收到以下错误:

ValueError:预期的对象或值

我也试过这个:

from ast import literal_eval

with open('dataset.json') as f:
    data = literal_eval(f.read())

df = pd.DataFrame(data)

它给出以下错误:

ValueError: 格式错误的字符串

编辑:

即使是 Json.loads 也不起作用。试过这个:

import json
data=json.loads('dataset.json')

ValueError: 无法解码 JSON 对象

Json 文件为 13.5MB,但似乎包含大量数据。

【问题讨论】:

  • json.loads 有效吗? (import json 先...)
  • 没有。我试过它给了我这个错误。检查编辑。
  • 我认为您可能会从这个答案中受益:stackoverflow.com/a/20644150/5276797

标签: python json pandas


【解决方案1】:

我必须添加参数lines=True 才能使其工作,例如:

pd.read_json("dataset.json", lines=True)

或者你可以这样做:

import json
import pandas as pd

with open("dataset.json") as f:
  df = pd.DataFrame([json.loads(l) for l in f.readlines()])
print(df)  # Shows data frame as expected 

【讨论】:

    【解决方案2】:

    对我来说,这是路径的问题。我必须使用的路径取决于我运行 python 文件的目录。也许尝试 'cd' 进入你的 python 文件的目录,然后data=pd.read_json('dataset.json') 应该可以工作。

    【讨论】:

      【解决方案3】:

      当 pd.read_json 失败时,以下内容对我有用: 打开文件,使用普通的 json.load 加载,然后加载到 pandas 数据帧中。

          import pandas as pd
          import json
      
          openfile=open('file.json')
          jsondata=json.load(openfile)
          df=pd.DataFrame(jsondata)
      
          openfile.close()
          print(df)
      

      【讨论】:

        【解决方案4】:

        我有同样的错误。原来它找不到文件。我修改了路径,pd.read_json 工作正常。至于json.loadsthis 可能会有帮助。

        【讨论】:

        • 有同样的错误,因为我移动了 jupyter 笔记本,而 jupyter 不会调整文件路径。 Pandas 在这里返回了最糟糕的错误消息。
        【解决方案5】:

        您需要向 Pandas 表明 datasets.json 中使用了“记录”格式(JSON 看起来像字典列表)。

        res = pd.read_json('input/dataset.json', orient='records')
        
        print(res.iloc[:, :5])
           %price  Weekly_pct  avg_dist  avg_price city
        0    15.4        46.2      3.67          5   ab
        1     0.0         NaN      8.26          5   bc
        

        【讨论】:

          【解决方案6】:

          我认为您可以使用 modul json 来读取 file.json,然后使用 DataFrame constructor

          import pandas as pd
          import json
          
          with open('file.json') as f:
             data = json.load(f)
          print data
          [{u'city': u'ab', u'medium': u'iPhone', u'request_date': u'2014-06-17', u'price': 1.1, u'Weekly_pct': 46.2, u'value': 4.7, u'%price': 15.4, u'avg_price': 5.0, u'date': u'2014-01-25', u'avg_dist': 3.67, u'type': True, u'trips': 4}, {u'city': u'bc', u'medium': u'Android', u'request_date': u'2014-05-05', u'price': 1.0, u'weekly_pct': 50.0, u'value': 5.0, u'%price': 0.0, u'avg_price': 5.0, u'date': u'2014-01-29', u'avg_dist': 8.26, u'type': False, u'trips': 0}]
          
          print pd.DataFrame(data)
          
             %price  Weekly_pct  avg_dist  avg_price city        date   medium  price  \
          0    15.4        46.2      3.67        5.0   ab  2014-01-25   iPhone    1.1   
          1     0.0         NaN      8.26        5.0   bc  2014-01-29  Android    1.0   
          
            request_date  trips   type  value  weekly_pct  
          0   2014-06-17      4   True    4.7         NaN  
          1   2014-05-05      0  False    5.0        50.0  
          

          【讨论】:

          • 我认为 OP 给出的示例有效,并且错误隐藏在大文件中的某处......
          • 嗯,我也收到了第一个错误 (ValueError: Expected object or value) 和第二个错误 (ValueError: malformed string) 的示例。但我的解决方案效果很好。
          • 好的。我只是按照@jezrael 的建议做了。它奏效了。但是我的列顺序不同。就像城市应该是第一列,但随着他的到来,它的顺序也不同。知道如何获得相同的列名顺序吗?
          • @jezrael 知道为什么read_json 会失败吗?为什么您的解决方案有效?即使json.loads(带有s)也失败了......
          • 我认为它失败了,因为json 文件中的字典列表。它是有效的json,但似乎read_json 不支持这些类型的 json。
          猜你喜欢
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2021-06-24
          • 2020-05-28
          • 1970-01-01
          • 2018-03-11
          • 2018-08-30
          • 2021-04-05
          相关资源
          最近更新 更多