여러 JSON 레코드를 Panda 데이터 프레임으로 읽기
다중 레코드 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)
주의: (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)
데이터 프레임의 크기에 따라 속도가 달라지지만 다른 옵션은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
주의: 그 때 가입은 놀라울 정도로 빠릅니다.
메모리를 절약하는 경우는, 파일을 1 행씩 읽어내는 것이 메모리 효율이 훨씬 향상됩니다.
with open('test.json') as f:
data = pd.DataFrame(json.loads(line) for line in f)
또, 만약 당신이import simplejson as json
컴파일된C 확장자는 에 포함되어 있습니다.simplejson
순수 피톤보다 훨씬 빠르다json
모듈.
팬더 0.19를 기준으로read_json
는 회선 구분 JSON을 네이티브로 지원하고 있습니다.
pd.read_json(jsonfile, lines=True)
++++++++업데이트 +++++++++++++++++++
v0.19 이후 Panda는 기본적으로 이 기능을 지원합니다(https://github.com/pandas-dev/pandas/pull/13351) 참조).그냥 실행:
df=pd.read_json('test.json', lines=True)
++++++++올드 앤서++++++++++++++++
기존 답변은 좋지만, 약간의 다양성을 위해 파이썬 이외의 간단한 전처리 단계를 필요로 하는 목표를 달성하기 위한 또 다른 방법이 있습니다.pd.read_json()
는 데이터를 소비할 수 있습니다.
- jq https://stedolan.github.io/jq/ 를 인스톨 합니다.
- 다음을 사용하여 유효한 json 파일 생성
cat test.json | jq -c --slurp . > valid_test.json
- 데이터 프레임 생성:
df=pd.read_json('valid_test.json')
ipython 노트북에서는 셀인터페이스에서 직접 shell 명령어를 실행할 수 있습니다.
!cat test.json | jq -c --slurp . > valid_test.json
df=pd.read_json('valid_test.json')
언급URL : https://stackoverflow.com/questions/20037430/reading-multiple-json-records-into-a-pandas-dataframe
'programing' 카테고리의 다른 글
React Faux DOM을 사용하여 D3 그룹화된 막대 차트에서 직사각형을 렌더링하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
---|---|
분류법 페이지에 태그 표시 (0) | 2023.03.16 |
react를 사용하여 HTML5 데이터 속성을 동적으로 설정하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
같은 요소를 가진 두 JSON 개체를 다른 순서로 비교하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
단순한 jQuery, PHP 및 JSONP의 예? (0) | 2023.03.16 |