我想知道是否存在一种将多记录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)
注意:(read_json自0.19.0开始)现在支持行分隔的json :
read_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:
str.join
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
注意:那时联接速度非常快。