JSON 데이터를 Pandas DataFrame으로 바꾸는 방법 | 리스트와 딕셔너리 구조 정리

JSON 데이터를 바로 DataFrame으로 변환할 수도 있지만, 실제 분석에서는 그렇게 하지 않는다.

핵심은 JSON 구조를 그대로 쓰지 않고, 필요한 필드만 추출해 리스트 또는 딕셔너리 형태로 재구성한 뒤 DataFrame으로 만드는 것이다.


JSON → DataFrame 기본 흐름

실전에서 가장 많이 쓰는 흐름은 아래다.

JSON → dict/list → 필요한 값 추출 → tot_data 누적 → DataFrame 변환

이 과정을 거치면

  • 불필요한 필드 제거
  • 구조 단순화
  • 분석용 컬럼 정리

까지 한 번에 해결된다.


1. JSON 구조에서 필요한 값만 뽑는다

예를 들어 API에서 받은 JSON 구조가 아래와 같다고 가정하자.

data = {
    "movieListResult": {
        "movieList": [
            {
                "movieCd": "1",
                "movieNm": "A",
                "movieNmEn": "A_EN",
                "openDt": "20260101",
                "directors": [{"peopleNm": "감독1"}]
            },
            {
                "movieCd": "2",
                "movieNm": "B",
                "movieNmEn": "B_EN",
                "openDt": "20260201",
                "directors": []
            }
        ]
    }
}

여기서 필요한 필드만 고르면 된다.

  • movieCd
  • movieNm
  • movieNmEn
  • openDt
  • director

2. 리스트 기반으로 데이터 누적하기

가장 기본적인 방식은 리스트에 쌓는 것이다.

tot_data = []

for item in data["movieListResult"]["movieList"]:
    movie_cd = item["movieCd"]
    movie_nm = item["movieNm"]
    movie_nm_en = item["movieNmEn"]
    open_dt = item["openDt"]

    if item["directors"] == []:
        director = ""
    else:
        director = item["directors"][0]["peopleNm"]

    tot_data.append([movie_cd, movie_nm, movie_nm_en, open_dt, director])

이 방식의 특징:

  • 구조가 단순함
  • 컬럼 순서를 직접 제어 가능
  • 가장 많이 쓰는 방식

3. DataFrame으로 변환

리스트를 만들었으면 바로 DataFrame으로 변환한다.

import pandas as pd

df = pd.DataFrame(
    data=tot_data,
    columns=["movieCd", "movieTitle", "movieETitle", "openDay", "dirName"]
)

print(df)

4. 딕셔너리 기반으로 만드는 방법

리스트 대신 dict 형태로 만드는 방법도 있다.

tot_data = []

for item in data["movieListResult"]["movieList"]:
    if item["directors"] == []:
        director = ""
    else:
        director = item["directors"][0]["peopleNm"]

    tot_data.append({
        "movieCd": item["movieCd"],
        "movieTitle": item["movieNm"],
        "movieETitle": item["movieNmEn"],
        "openDay": item["openDt"],
        "dirName": director
    })

df = pd.DataFrame(tot_data)

이 방식의 특징:

  • 컬럼명을 같이 정의 가능
  • 가독성이 더 좋음
  • 컬럼 순서는 자동 결정

리스트 vs 딕셔너리 방식 비교

방식 장점 단점

리스트 빠르고 단순 컬럼 순서 직접 관리
dict 가독성 좋음 약간 더 길어짐

실무에서는 dict 방식이 더 많이 쓰인다.


5. 문자열 날짜 분리 (후처리)

JSON 데이터는 문자열 형태가 많다.

그래서 보통 추가 가공을 한다.

df["year"] = df["openDay"].str[:4]
df["month"] = df["openDay"].str[4:6]
df["day"] = df["openDay"].str[6:8]

이렇게 하면 분석용 컬럼으로 쓸 수 있다.


6. index 설정 (set_index)

유니크한 값이 있으면 index로 바꾸는 게 좋다.

df.set_index("movieCd", inplace=True)

이렇게 하면

  • 데이터 조회가 쉬워지고
  • 중복 체크도 쉬워진다

7. CSV 저장 시 인코딩 문제

한글 데이터가 있으면 인코딩 문제도 같이 발생한다.

df.to_csv("movie.csv", encoding="utf-8")

또는 Windows 환경에서는:

df.to_csv("movie.csv", encoding="cp949")

이 부분은 JSON → DataFrame 이후 거의 항상 붙는 단계다.


구현 관점 핵심 포인트

1. JSON을 그대로 DataFrame으로 만들지 않는다

→ 필요한 필드만 추출하는 게 핵심


2. 리스트/딕셔너리 중 하나로 재구성한다

→ 구조를 평평하게(flat) 만드는 과정


3. 예외 처리 필수

if item["directors"] == []

4. DataFrame은 마지막 단계

→ JSON은 중간 데이터일 뿐


5. 후처리까지 같이 생각해야 한다

  • 날짜 분리
  • index 설정
  • CSV 저장

한 줄 정리

JSON 데이터는 그대로 DataFrame으로 쓰지 말고, 필요한 값만 추려 리스트나 딕셔너리로 재구성한 뒤 변환하는 것이 핵심이다.