将Json文件读取为Pandas数据框时出错

23

我有一个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')

值错误:无法解码 JSON 对象

JSON 文件大小为13.5MB,但似乎包含了大量的数据。


json.loads 能用吗?(先 import json...) - IanS
不行,我尝试过了,它给了我这个错误。请检查编辑。 - Baktaawar
我认为您可能会从这个答案中受益:https://dev59.com/qXrZa4cB1Zd3GeqP1l55#20644150 - IanS
6个回答

17
我认为您可以使用模块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  

1
我认为 OP 给出的示例是有效的,而错误可能深藏在大文件中... - IanS
1
嗯,我使用示例也遇到了第一个错误('ValueError:Expected object or value')和第二个错误('ValueError:malformed string')。但是我的解决方案非常有效。 - jezrael
1
@jezrael,你有没有想过为什么read_json会失败?以及为什么你的解决方案可行?即使使用json.loads(带有s),也无法正常工作... - IanS
是的。Json.loads 失败了,read_json 也失败了,甚至是 ujson.load 也失败了。我尝试过这三个方法都无法成功,但是 json.load 却可以。 - Baktaawar
2
我认为它失败了,因为json文件中有字典列表。这是有效的json,但似乎read_json不支持这种类型的json - jezrael
显示剩余2条评论

10

我遇到了同样的错误。原来是找不到文件。我修改了路径,pd.read_json 就可以正常工作了。至于json.loads这里可能会有所帮助。


1
出现了相同的错误,因为我移动了Jupyter笔记本,而Jupyter不会调整文件路径。在这里,Pandas返回了最糟糕的错误消息。 - Suzana

8
您需要告诉Pandas,datasets.json 中使用了“records”格式(其中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

5
当 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)

0

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


0

我不得不添加参数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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接