Pandas使用read_json读取int64值时出现ValueError: Value is too big错误

5

我正在尝试将 JSON 文件读入数据帧。

df = pd.read_json('test.log', lines=True)

然而,有些值是int64类型的,Pandas会报错:

ValueError: Value is too big

我尝试将precise_float设置为True,但这并没有解决问题。

按行执行时它可以正常工作:

df = pd.DataFrame()
with open('test.log') as f:
    for line in f:
        data = json.loads(line)
        df = df.append(data, ignore_index=True)

然而这种方法非常缓慢。对于大约50k行的文件,它需要很长时间。

有没有办法将某些列的值设置为使用int64?


1
@Ben.T 当设置块大小时,它会返回一个迭代器对象。但是,如果我尝试在 for i in df: 中循环使用它,它会引发相同的错误。 - user3605780
2个回答

9

在将pandas更新到较新版本(已测试1.0.3)后,可以应用artdgn此解决方法来覆盖pandas.io.json._json中使用的loads()函数,这个函数最终在调用pd.read_json()时使用。

如果上面的链接失效,可以复制此解决方法:


import pandas as pd

# monkeypatch using standard python json module

import json

pd.io.json._json.loads = lambda s, *a, **kw: json.loads(s)

# monkeypatch using faster simplejson module
import simplejson
pd.io.json._json.loads = lambda s, *a, **kw: simplejson.loads(s)

# normalising (unnesting) at the same time (for nested jsons)
pd.io.json._json.loads = lambda s, *a, **kw: pandas.json_normalize(simplejson.loads(s))

在使用artdgn所描述的三种方法之一覆盖loads()函数后,read_json()也可以处理int64


将dtype设置为np.int64会不幸地引发相同的错误。 - user3605780
我正在使用 pandas v1.0.3,并且 pandas.io.json._json.loads() 已经存在。 - Marcel
2
我之前使用的是0.24.1版本,但是现在已经卸载并安装了1.0.3版本,现在它可以正常工作了。新增了大约55列带有NaN值。但是稍微清理一下就可以快速加载数据了。谢谢。 - user3605780
我编辑了版本相关内容。解决方法是否也是必要的呢?--好的,我仔细考虑了一下并认为这里描述的解决方法(https://github.com/pandas-dev/pandas/issues/26068#issuecomment-550900208)并不是必要的,否则加载的速度就会很慢。你能确认一下吗?这样答案就会完整些。 - Marcel
谢谢!我很感激你抽出时间来完善答案。现在它更加简明扼要了。我也很高兴能够帮助到你。 - Marcel
显示剩余5条评论

1

这是一个众所周知的问题。 在pandas的fork版本的ultrajson库中,大数解码仍未实现。最接近的实现也没有被合并。不管怎样,你可以使用其他答案提供的解决方法。


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