programing

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

css3 2023. 3. 16. 21:41

여러 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