반응형
다중 레코드 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
반응형
'파이썬' 카테고리의 다른 글
파이썬 배열에 행과 열을 추가하려면 어떻게해야합니까? (0) | 2020.12.31 |
---|---|
파이썬 Pandas를 사용하여 문자열 열의 각 값에 문자열 접두사 추가 (0) | 2020.12.31 |
파이썬 Windows에서 tkinter를 pip 또는 easy_install하는 방법 (0) | 2020.12.31 |
파이썬 pip-3.3 MySQL-python 설치 (0) | 2020.12.31 |
파이썬 Python NumPy에서 np.mean () 대 np.average ()? (0) | 2020.12.31 |
댓글