python-将多个JSON记录读取到Pandas数据框中

我想知道是否存在一种将多记录JSON文件(每行是一个JSON dict)读入熊猫数据帧的内存有效方式。 下面是带有工作解决方案的2行示例,我可能需要非常多的记录。 示例用途是处理Hadoop Pig JSonStorage函数的输出。

import json
import pandas as pd

test='''{"a":1,"b":2}
{"a":3,"b":4}'''
#df=pd.read_json(test,orient='records') doesn't work, expects []

l=[ json.loads(l) for l in test.splitlines()]
df=pd.DataFrame(l)
seanv507 asked 2020-08-09T10:08:16Z
4个解决方案
50 votes

注意:str.join(自0.19.0开始)现在支持行分隔的json:

In [31]: pd.read_json('{"a":1,"b":2}\n{"a":3,"b":4}', lines=True)
Out[31]:
   a  b
0  1  2
1  3  4

或使用文件/文件路径而不是json字符串:

pd.read_json(json_file, lines=True)

这将取决于您的DataFrames的大小,该大小会更快,但是另一种选择是使用str.join将多行“ JSON”(注意:它不是有效的json)粉碎成有效的json并使用read_json:

In [11]: '[%s]' % ','.join(test.splitlines())
Out[11]: '[{"a":1,"b":2},{"a":3,"b":4}]'

对于这个小例子,它的速度较慢,如果大约100,则更大,这是相似的,可观的收益...

In [21]: %timeit pd.read_json('[%s]' % ','.join(test.splitlines()))
1000 loops, best of 3: 977 µs per loop

In [22]: %timeit l=[ json.loads(l) for l in test.splitlines()]; df = pd.DataFrame(l)
1000 loops, best of 3: 282 µs per loop

In [23]: test_100 = '\n'.join([test] * 100)

In [24]: %timeit pd.read_json('[%s]' % ','.join(test_100.splitlines()))
1000 loops, best of 3: 1.25 ms per loop

In [25]: %timeit l = [json.loads(l) for l in test_100.splitlines()]; df = pd.DataFrame(l)
1000 loops, best of 3: 1.25 ms per loop

In [26]: test_1000 = '\n'.join([test] * 1000)

In [27]: %timeit l = [json.loads(l) for l in test_1000.splitlines()]; df = pd.DataFrame(l)
100 loops, best of 3: 9.78 ms per loop

In [28]: %timeit pd.read_json('[%s]' % ','.join(test_1000.splitlines()))
100 loops, best of 3: 3.36 ms per loop

注意:那时联接速度非常快。

Andy Hayden answered 2020-08-09T10:08:41Z
27 votes

如果您要节省内存,那么一次读取一行文件将大大提高内存效率:

with open('test.json') as f:
    data = pd.DataFrame(json.loads(line) for line in f)

另外,如果您import simplejson as json,则simplejson随附的已编译C扩展比纯Python json模块要快得多。

Doctor J answered 2020-08-09T10:09:09Z
14 votes

从Pandas 0.19开始,read_json对行分隔JSON具有本机支持:

pd.read_json(jsonfile, lines=True)
Doctor J answered 2020-08-09T10:09:28Z
2 votes

++++++++更新++++++++++++++++

从v0.19开始,Pandas原生支持此功能(请参阅[https://github.com/pandas-dev/pandas/pull/13351)。]只需运行:

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

++++++++旧答案++++++++++

现有的答案很好,但是有一点点变化,这是达成目标的另一种方法,它需要在python之外进行简单的预处理步骤,以便df=pd.read_json('valid_test.json')可以使用数据。

  • 安装jq [https://stedolan.github.io/jq/。]
  • 使用df=pd.read_json('valid_test.json')创建有效的json文件
  • 使用df=pd.read_json('valid_test.json')创建数据框

在ipython notebook中,您可以直接从单元界面运行shell命令,方法如下:

!cat test.json | jq -c --slurp . > valid_test.json
df=pd.read_json('valid_test.json')
Bob Baxley answered 2020-08-09T10:10:20Z
translate from https://stackoverflow.com:/questions/20037430/reading-multiple-json-records-into-a-pandas-dataframe