본문 바로가기
파이썬

파이썬 여러 JSON 레코드를 Pandas 데이터 프레임으로 읽기

by º기록 2020. 12. 31.
반응형

다중 레코드 JSON 파일 (각 줄은 JSON dict)을 pandas 데이터 프레임으로 읽는 메모리 효율적인 방법이 있는지 알고 싶습니다. 아래는 작업 솔루션이 포함 된 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)

 

해결 방법

 


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

참고 : 그 당시 가입 속도는 놀랍도록 빠릅니다.

 

참조 페이지 https://stackoverflow.com/questions/20037430

 

 

반응형

댓글