AI, DataScience
[NumPy] np.all, np.any 실전 사용예시
이무기뱀술
2023. 6. 26. 13:01
728x90
각종 질환의 가족별 가족력을 구하는 코드를 만들어 보자.
기존 데이터셋은
병 있는 가족 1 | 아버지 |
병 있는 가족 2 | 누나 |
병 있는 가족 3 | 동생 |
병 있는 가족 4 | 없음 |
이런 식으로 되어 있었는데,
가족력 없음 | False |
병 있는 부모 | True |
병 있는 형제자매 | True |
병 있는 기타 가족 | False |
이런 식으로 바꾸는 코드를 만들어보자
내가 기존에 짠 코드이다.
# 세상에 내 코드는 구데기였어
# 가족력 가공
# N: 가족력 없음, P: parent 부모, S: sibling 형제자매, O: other 기타
disease_dict = { # 각 질환별 가족력 있는 가족의 최대 인원
'HT': 4,
'DM': 4,
'CVA': 3,
'OS': 2,
'CVB': 2,
'CD': 2,
'PV': 2,
'LP': 2,
'GT': 2,
'CH': 1
}
for disease, num_family in disease_dict.items(): # 질환마다 가족 수가 달라 다르게 만듦..?
if num_family == 1:
dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999), 1, 0)
for i in range(num_family):
for f in ['P', 'S', 'O']:
dataset['AS1_FM'+disease+'REL_'+f] = np.where(dataset['AS1_FM'+disease+'REL1A'] == i, 1, 0)
elif num_family == 2:
dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
(dataset['AS1_FM'+disease+'REL2A'] == 99999), 1, 0)
for i in range(num_family):
for f in ['P', 'S', 'O']:
dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
dataset['AS1_FM'+disease+'REL2A'] == i, 1, 0)
elif num_family == 3:
dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
(dataset['AS1_FM'+disease+'REL2A'] == 99999) &
(dataset['AS1_FM'+disease+'REL3A'] == 99999), 1, 0)
for i in range(num_family):
for f in ['P', 'S', 'O']:
dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
(dataset['AS1_FM'+disease+'REL2A'] == i) |
(dataset['AS1_FM'+disease+'REL3A'] == i), 1, 0)
elif num_family == 4:
dataset['AS1_FM'+disease+'REL_N'] = np.where((dataset['AS1_FM'+disease+'REL1A'] == 99999) &
(dataset['AS1_FM'+disease+'REL2A'] == 99999) &
(dataset['AS1_FM'+disease+'REL3A'] == 99999) &
(dataset['AS1_FM'+disease+'REL4A'] == 99999), 1, 0)
for i in range(num_family):
for f in ['P', 'S', 'O']:
dataset['AS1_FM'+disease+'REL_'+f] = np.where((dataset['AS1_FM'+disease+'REL1A'] == i) |
(dataset['AS1_FM'+disease+'REL2A'] == i) |
(dataset['AS1_FM'+disease+'REL3A'] == i) |
(dataset['AS1_FM'+disease+'REL4A'] == i), 1, 0)
분명 반복문을 써서 코드를 단순화하려고 했지만... 반복되는 구문이 많아 가독성이 떨어진다. 어떻게 하면 좋을까?
이 문제는
- List Comprehesion
- np.all
- np.any
를 잘 활용하면 간단하게 만들 수 있다.
# 와 ChatGPT가 아니었다면 np.all과 np.any를 몰랐을거야!
# 가족력 가공
# N: 가족력 없음, P: parent 부모, S: sibling 형제자매, O: other 기타
disease_dict = {
'HT': 4,
'DM': 4,
'CVA': 3,
'OS': 2,
'CVB': 2,
'CD': 2,
'PV': 2,
'LP': 2,
'GT': 2,
'CH': 1
}
for disease, num_family in disease_dict.items():
dataset[f'AS1_FM{disease}REL_N'] = np.all(dataset[[f'AS1_FM{disease}REL{i}A' for i in range(1, num_family+1)]] == 99999, axis=1).astype(int)
for f in ['P', 'S', 'O']:
dataset[f'AS1_FM{disease}REL_{f}'] = np.any(dataset[[f'AS1_FM{disease}REL{i}A' for i in range(1, num_family+1)]] == np.arange(num_family)[:, None], axis=0).astype(int)
728x90