As-Is
: 데이터프레임에서 특정 컬럼들의 값을 for문을 통해 불러와, 특정 key(patient_code, seq_no)의 유무를 체크해 dictionary내의 값을 채움
# 조회용 Dict 생성
search_col = ['patient_code', 'seq_no', 'disease_code', 'atc_set', 'prescription_date', 'diagnosis_date', 'sex', 'age', 'weight', 'bmi', 'a1c', 'scr', 'egfr']
transform_dict = {}
for patient_code, seq_no, disease_code, atc_set, prescription_date, diagnosis_date, sex, age, weight, bmi, a1c, scr, egfr in tqdm(data[search_col].values):
if patient_code not in transform_dict:
transform_dict[patient_code] = {
seq_no : {
'disease_code' : disease_code,
'atc_set' : atc_set,
'prescription_date' : prescription_date,
'diagnosis_date' : diagnosis_date,
'sex' : sex,
'age' : age,
'weight' : weight,
'bmi' : bmi,
'a1c' : a1c,
'scr' : scr,
'egfr' : egfr
}
}
else :
transform_dict[patient_code][seq_no] = {
'disease_code' : disease_code,
'atc_set' : atc_set,
'prescription_date' : prescription_date,
'diagnosis_date' : diagnosis_date,
'sex' : sex,
'age' : age,
'weight' : weight,
'bmi' : bmi,
'a1c' : a1c,
'scr' : scr,
'egfr' : egfr
}
문제점
1. dictionary내부의 값들을 채우는데, 각 항목들에 대해 반복적으로 정의하는 구문이 포함되어 있다.(코드길이가 길어짐)
2. 불필요한 if/else 문 존재
3. for문에서 출력되는 iteration value의 변수를 일일이 정의하고있음(필요한 것만 정의하면 될텐데..)
To-Be
: iteration value중 필요한 부분만 정의하고, setdefault를 통해서, dictionary의 key 존재유무에 따른 값채우기를 간결한 코드로 대체할 수 있다.
search_col = ['patient_code', 'seq_no', 'disease_code', 'atc_set', 'prescription_date', 'diagnosis_date', 'sex', 'age', 'weight', 'bmi', 'a1c', 'scr', 'egfr']
transform_dict = {}
for values in tqdm(data[search_col].values):
patient_code, seq_no, *rest = values
transform_dict.setdefault(patient_code, {})[seq_no] = dict(zip(search_col[2:], rest))
'DEVELOP_NOTE > Python' 카테고리의 다른 글
Garbage Collection(가비지 컬렉션, GC)은 어떻게 동작할까? (0) | 2024.02.22 |
---|---|
Python Decorator @ 사용방법 완벽 이해하기! (0) | 2024.02.07 |
Python Generator (a.k.a. 'yield') (2) | 2024.02.06 |