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으로 쓰지 말고, 필요한 값만 추려 리스트나 딕셔너리로 재구성한 뒤 변환하는 것이 핵심이다.
'Data Analytics > 수집·크롤링' 카테고리의 다른 글
| BeautifulSoup XML 파싱 정리 | find와 find_all 차이부터 영화 정보 추출까지 (0) | 2026.05.08 |
|---|---|
| JSON과 XML 차이 정리 | API 응답 포맷에 따라 파이썬 처리 방식이 달라지는 이유 (0) | 2026.05.07 |
| requests.get 정리 | params로 API URL 깔끔하게 보내는 방법 (0) | 2026.05.07 |
| 파이썬 API 데이터 수집 정리 | urllib와 json으로 JSON 응답 받아 DataFrame 만들기 (0) | 2026.05.06 |
| JSON이란 | 파이썬에서 json.loads()로 데이터 접근하는 방법 (0) | 2026.04.30 |
