[Python] json to dataframe

2022. 4. 4. 10:47파이썬

2~3가지 방법들이 있는데 해당 내용들을 정리해보고자 한다.

1. Dict to Dataframe in Python

JSON 형식을 Dataframe으로 변환하는 방법을 찾아 헤메던 과정에서 알게 된 내용을 정리해보았다.

나사 날씨데이터로 받은 날씨 JSON은 아래와 같다.

{'ALLSKY_SFC_SW_DWN': {'20170101': 2.06,
  '20170102': 1.8,
  '20170103': 3.12,
  '20170104': 2.71,
  '20170105': 1.34,
  '20170106': 2.05,
  ...
  • 이 정보들을 최상위 key를 컬럼으로 2번쨰 key를 인덱스로, value들을 value로 변환하려고 했다
  • json_normalize()함수를 사용해서 어떻게 집어넣어야 겠다라고 생각했으나... 너무 복잡하게 생각했다
  • 리스트던 아니던 상관 없는듯?
df_stat = pd.DataFrame(json_stat)

한줄이면 JSON to Dataframe 완성.

ALLSKY_SFC_SW_DWN CLRSKY_SFC_SW_DWN ALLSKY_KT ALLSKY_SFC_LW_DWN T2M T2MDEW T2MWET T2M_RANGE T2M_MAX T2M_MIN QV2M RH2M PS WS10M WS10M_MAX WS10M_MIN WS10M_RANGE
20170101 2.06 2.42 0.46 290.90 4.08 2.30 3.19 5.84 7.88 2.05 4.39 88.69 102.18 2.56 3.99 1.12 2.88
20170102 1.80 2.29 0.41 306.69 3.92 3.13 3.53 9.31 8.92 -0.39 4.76 92.38 101.70 4.05 5.61 3.05 2.56

그렇지만 찾은 게 아까우니까 기록은 남긴다.


Dict to Dataframe

test_row = json_stat[0]
test_result = pd.DataFrame.from_dict(test_row)

[pd.DataFrame.from_dict]

pd.DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)

- data : dict 형식의 데이터 ({field : array-like} 또는 {field : dict})

- orient : 데이터의 방향 (orientation).
columns - dict 데이터의 key가 column값 (default)

​ index - dict 데이터의 key가 row값 (transposed된 형태)

- dtype : 데이터 타입 (보통 default)

- columns : orient='index'일 때 컬럼 라벨 지정. 리스트 형식

그러나... 이렇게 실행하면 다음의 에러가 발생한다.

If using all scalar values, you must pass an index

json_stat의 key value가 모두 스칼라 형식으로 되어 있기 때문!

에러 해결방식은 다음의 4가지 방식이 있다.

  1. Index 값 설정
test_result = pd.DataFrame(test_row, index = [0])
  1. Scalar 형식 -> 리스트 형식 (여기선 하지 말자...)
# dict.values 값을 모두 리스트 형식으로 처리
test_row = {'TBL_NM': ['인구 가구 및 주택 - 읍면동(2015) 시군구(2016~)'],
            'PRD_DE': [2017'],...
            }
  1. 리스트 처리된 dict 데이터를 from_records로 변환
test_result = pd.DataFrame.from_records([test_row])
  1. 리스트 처리된 dict 데이터를 from_dict로 변환
test_result = pd.DataFrame.from_dict([test_row])

json_normalize()

출처 : https://gin-girin-grim.tistory.com/1