View

csv 파일의 형식은 직관적이어서 알기 쉽습니다.

열(Column)으로 데이터의 속성을 정의하고, 그 하단에 행(Row)로써 해당하는 값을 채워넣습니다.

그에 비해 json 파일은 csv보다 처음 이해할 때 조금 난이도가 있는 편입니다.

하지만 대부분의 웹이나 Open API에서 데이터를 다룰 땐 여러모로 장점이 많아서 json을 쓰죠! 

 

 

어쨌든 두 파일형식 모두 다 데이터 관리에 자주 쓰입니다.

그러다보니 종종 csv 파일을 받아보면 레코드가 json 형식으로 되어있는 경우가 있어요.

 

 

뭔가 복잡해보이는 cast와 crew 컬럼

예전에 캐글에서 받아두었던 영화 관련 csv 파일을 엑셀로 열어봤습니다.

컬럼수가 적어서 얼핏 보면 단순해보이지만, cast와 crew를 보시면 많은 인원 정보를 json 형식으로 담고 있어요.

제일 중요한 정보가 저 두 열이니, 작업이 용이하도록 pandas로 별도의 DataFrame 여러개로 만들어 나눠야겠습니다.

각 영화별 상위 n개의 cast 정보를 추출해서 저장해보겠습니다.

 

이 글에서 사용할 데이터셋입니다.

https://www.kaggle.com/tmdb/tmdb-movie-metadata

 


1. 데이터 파일 불러오기

우선 pandas로 csv 파일을 불러옵니다.

가독성 및 편의상 데이터프레임 이름은 간결하게 지었습니다.

import pandas as pd

df1 = pd.read_csv(r'./credits.csv')
df1.drop(['title','crew'],axis=1,inplace=True) #필요없는 컬럼 삭제
df1.head()

제 경우에는 cast의 정보만을 추출하고 싶었기에, 불필요한 컬럼들은 지웠습니다.

 


2. read_json()

pandas에서 json을 읽어올 때에는 read_json()을 사용합니다.

cast 컬럼의 첫째 행의 상위 5개만 추출해봅니다.

cast = df1['cast']
new_cast = pd.read_json(cast[0]).iloc[:5] #상위 5개의 정보 추출
new_cast

 


3. for문으로 모든 행의 json 형식을 변환하기

이제 cast의 정보를 담을 새 DataFrame을 정의합니다. 여기에 최종 결과를 저장할겁니다.

movie_cast = pd.DataFrame()

 

다음으로 for문 안에서 영화 한편의 정보를 저장할 별도의 데이터프레임 df2를 선언하고,

read_json()으로 df2에 정보를 저장합니다.

양이 많아서 여기도 영화 하나당 상위 5개만 추출했습니다.

for i in cast.index:
    df2 = pd.DataFrame() #각 영화의 정보를 저장할 별도의 df
    df2 = df2.append(pd.read_json(cast[i]).iloc[:5]) #영화별 상위 5개의 정보 저장
    df2['movie_id'] = df1['movie_id'][i] #해당 영화의 id정보 저장
    movie_cast = movie_cast.append(df2) #영화별 최종결과를 movie_cast에 저장

만약 위 코드대로 별도의 df를 사용하지 않고 최종결과인 movie_cast에 바로 append로 붙여버리면,

csv파일에서 불러온 데이터프레임의 다른 컬럼값(movie_id)이 제대로 저장되지 않습니다.

가장 마지막 레코드의 id값으로 저장되니 주의해주세요.

 


4. 인덱스 리셋

위 코드대로 작성한 경우 인덱스값이 0~4로 계속 반복됩니다.

그러니 새로운 인덱스를 만들어주면 보기 좋겠습니다!

movie_cast.reset_index(inplace=True)
movie_cast.drop('index',axis=1,inplace=True)

 


5. 최종결과

 

원본파일 레코드가 3만개정도 되어서 극히 일부만 추출해봤습니다.

20개의 영화에, 각 영화당 5명의 배우 출연 정보입니다.

총 100개가 나와야하니 잘 되었네요!

 

Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31