2022년 7월부터 9월까지 진행한 연구 데이터 활용분석 경진대회 관련 첫번째 포스팅 글입니다.
제가 맡은 첫번째 과제는 국민건강영양조사 데이터의 메타데이터를 연도별로 구축하는 것입니다.
메타데이터는 각 년도별 국민건강영양조사 원시자료 이용지침서를 기준으로, 1998, 2001, 2005, 2007-2009, 2010-2012, 2013,2015, 2014, 2016-2018, 2019-2020으로 나뉘어 구축되었습니다.
본 포스팅은 메타데이터를 구축하기 위해 작성한 코드입니다.
import pandas as pd
import numpy as np
df=pd.read_excel('/Users/i/Downloads/variable.xlsx',sheet_name='2019-2020')
variable=pd.DataFrame({'변수명':[],'변수설명':[],'내용':[],'etc':[]})
df2=df[['변수명','변수설명','내용']]
df2
| 변수명 | 변수설명 | 내용 | |
|---|---|---|---|
| 0 | mod_d | 최종 DB 수정일 | NaN |
| 1 | ID | 개인 아이디 | NaN |
| 2 | ID_fam | 가구 아이디 | NaN |
| 3 | year | 조사연도 | NaN |
| 4 | region | 17개 시도 | 1. 서울 |
| ... | ... | ... | ... |
| 3211 | HE_prg | 임신여부 | 0. 아니오 |
| 3212 | NaN | NaN | 1. 예 |
| 3213 | NaN | NaN | 8. 비해당(남자) |
| 3214 | HE_dprg | 임신개월수 | □□ 개월 |
| 3215 | wt_oent | (건강설문(건강면접/건강행태) OR 검진) AND 영양 연관성분석 가중치 | NaN |
3216 rows × 3 columns
lis=[]
col=[]
for j in range(len(df2)):
data1 = df2.loc[j][0]
data2 = df2.loc[j][1]
data3 = df2.loc[j][2]
if j==0:
lis.append(data1)
lis.append(data2)
lis.append(data3)
else:
if df2.loc[j][0] == data1: #변수명에 값이 있다면 #변수명, 변수설명 추가
variable = pd.concat([variable,pd.DataFrame({'변수명': [lis[0]],'변수설명':[lis[1]],'내용':[lis[2:]],'etc':[col]})])
#variable.append({'변수명': lis[0],'변수설명':lis[1],'내용':lis[2:],'etc':col},ignore_index=True)
#variable.loc[j-1]=[lis[0],lis[1],lis[2:],col]
lis=[] #변수명, 변수설명, 내용
col=[] #기타
lis.append(data1) #변수명
lis.append(data2) #변수설명
if df2.loc[j][2] != data3: #내용이 없다면
continue #계속
elif df2.loc[j][2] == data3: #있다면
if (data3[0].isdigit()==True and not data3.startswith('1일') and '.' in data3) or (data3.startswith(' ')):
data3=data3.replace(". "," : ")
data3=data3.replace("\xa0","")
lis.append(data3) #리스트에 일단 저장
elif data3.startswith('(청'):
lis[-1]+=data3
elif data3.startswith('1일'):
col.append(data3)
else:
col.append(data3)
elif df2.loc[j][0] != data1: #변수명에 값이 없다면
if type(data3)==str:
if (data3[0].isdigit()==True and '.' in data3) or (data3.startswith(' ')):
data3=data3.replace(". "," : ")
data3=data3.replace("\xa0","")
lis.append(data3)
elif data3.startswith('(청'):
lis[-1]+=data3
else:
col.append(data3)
len(variable)
936
variable
| 변수명 | 변수설명 | 내용 | etc | |
|---|---|---|---|---|
| 0 | mod_d | 최종 DB 수정일 | [nan] | [] |
| 0 | ID | 개인 아이디 | [] | [] |
| 0 | ID_fam | 가구 아이디 | [] | [] |
| 0 | year | 조사연도 | [] | [] |
| 0 | region | 17개 시도 | [1 : 서울, 2 : 부산, 3 : 대구, 4 : 인천, 5 : 광주, 6 : 대... | [] |
| ... | ... | ... | ... | ... |
| 0 | HE_DMdg | 당뇨병 의사진단 여부 | [0 : 아니오, 1 : 예] | [] |
| 0 | HE_DMdr | 검진당일 당뇨병 약 복용 여부 | [0 : 아니오, 1 : 예] | [] |
| 0 | HE_mens | 생리여부 | [0 : 아니오, 1 : 예, 8 : 비해당(남자)] | [] |
| 0 | HE_prg | 임신여부 | [0 : 아니오, 1 : 예, 8 : 비해당(남자)] | [] |
| 0 | HE_dprg | 임신개월수 | [] | [□□ 개월] |
936 rows × 4 columns
tt=pd.DataFrame({'선택지_설명':[]})
for data in variable['내용']:
if len(data)==0:
data=np.nan
tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
elif np.nan in data:
data=np.nan
tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
else:
data=" ".join(j+" |" for j in data)
tt=pd.concat([tt,pd.DataFrame({'선택지_설명':[data]})])
tt
| 선택지_설명 | |
|---|---|
| 0 | NaN |
| 0 | NaN |
| 0 | NaN |
| 0 | NaN |
| 0 | 1 : 서울 | 2 : 부산 | 3 : 대구 | 4 : 인천 | 5 : 광주 | 6... |
| ... | ... |
| 0 | 0 : 아니오 | 1 : 예 | |
| 0 | 0 : 아니오 | 1 : 예 | |
| 0 | 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | |
| 0 | 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | |
| 0 | NaN |
936 rows × 1 columns
variable_total=pd.concat([variable,tt],axis=1)
variable_total=variable_total[['변수명','변수설명','선택지_설명','etc']]
variable_total
| 변수명 | 변수설명 | 선택지_설명 | etc | |
|---|---|---|---|---|
| 0 | mod_d | 최종 DB 수정일 | NaN | [] |
| 0 | ID | 개인 아이디 | NaN | [] |
| 0 | ID_fam | 가구 아이디 | NaN | [] |
| 0 | year | 조사연도 | NaN | [] |
| 0 | region | 17개 시도 | 1 : 서울 | 2 : 부산 | 3 : 대구 | 4 : 인천 | 5 : 광주 | 6... | [] |
| ... | ... | ... | ... | ... |
| 0 | HE_DMdg | 당뇨병 의사진단 여부 | 0 : 아니오 | 1 : 예 | | [] |
| 0 | HE_DMdr | 검진당일 당뇨병 약 복용 여부 | 0 : 아니오 | 1 : 예 | | [] |
| 0 | HE_mens | 생리여부 | 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | | [] |
| 0 | HE_prg | 임신여부 | 0 : 아니오 | 1 : 예 | 8 : 비해당(남자) | | [] |
| 0 | HE_dprg | 임신개월수 | NaN | [□□ 개월] |
936 rows × 4 columns
variable_total.to_csv('hn_19_variable.csv',index=False,encoding='utf-8')
variable_total.to_csv('hn_20_variable.csv',index=False,encoding='utf-8')
댓글