-
[NumPy] np.all, np.any 실전 사용예시AI, DataScience 2023. 6. 26. 13:01728x90
각종 질환의 가족별 가족력을 구하는 코드를 만들어 보자.
기존 데이터셋은
병 있는 가족 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'AI, DataScience' 카테고리의 다른 글
[Pandas] IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match). 해결법 (0) 2023.08.24 [논문 리뷰] Improving Imbalanced Classification by Anomaly Detection (0) 2023.08.22 ChatGPT 탈옥 : AntiGPT 체험기 (0) 2023.03.28 관절 각도 기반 Pose Estimation 설명 (0) 2023.01.31 [논문 리뷰] Deep Neural Networks and Tabular Data: A Survey (0) 2022.11.15