데이터 분석 작업을 하다 보면 딕셔너리에서 음수 값을 제거해야 하는 상황을 자주 마주하게 됩니다. 이를 위해서는 딕셔너리의 각 요소를 순회하면서 조건문으로 값을 검사하는 과정이 필요합니다. 이 글에서는 두 가지 방법을 소개합니다.
for 루프 사용하기
가장 기본적인 방법은 for 루프를 활용하는 것입니다. 각 반복 단계에서 items() 함수를 사용해 키와 값을 가져오고, 값이 0보다 크거나 같은지 비교하여 음수 여부를 판단합니다.
예제
dict_1 = {'x':10, 'y':20, 'z':-30, 'p':-0.5, 'q':50}
print ("Given Dictionary :", str(dict_1))
final_res_1 = dict((i, j) for i, j in dict_1.items() if j >= 0)
print("After filtering the negative values from dictionary : ", str(final_res_1))
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given Dictionary : {'x': 10, 'y': 20, 'z': -30, 'p': -0.5, 'q': 50}
After filtering the negative values from dictionary : {'x': 10, 'y': 20, 'q': 50}
위 예제에서 제너레이터 표현식이 딕셔너리의 모든 키-값 쌍을 하나씩 확인하고, 값이 0 이상인 항목만 새로운 딕셔너리로 구성합니다. 그 결과 'z'와 'p'처럼 음수 값을 가진 항목은 최종 결과에서 자연스럽게 제외됩니다.
lambda 함수 사용하기
좀 더 간결하고 깔끔한 문법을 원한다면 lambda 함수를 활용할 수 있습니다. 로직 자체는 앞서 살펴본 방식과 동일하지만, 내장 함수인 filter()와 lambda를 조합하면 코드를 한 줄로 처리할 수 있습니다.
예제
dictA = {'x':-4/2, 'y':15, 'z':-7.5, 'p':-9, 'q':17.2}
print ("\nGiven Dictionary :", dictA)
final_res = dict(filter(lambda k: k[1] >= 0.0, dictA.items()))
print("After filtering the negative values from dictionary : ", str(final_res))
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given Dictionary : {'x': -2.0, 'y': 15, 'z': -7.5, 'p': -9, 'q': 17.2}
After filtering the negative values from dictionary : {'y': 15, 'q': 17.2}
여기서 lambda 함수는 k[1], 즉 각 키-값 쌍의 두 번째 요소(값)를 받아 0.0 이상인지 검사합니다. filter()는 조건을 만족하는 항목만 걸러내며, 마지막에 dict() 생성자가 필터링된 결과를 다시 딕셔너리 형태로 변환해 줍니다.
정리
두 방법 모두 동일한 결과를 만들어내지만, 상황에 따라 선택 기준이 달라질 수 있습니다.
- for 루프 + 제너레이터 표현식: 초보자에게 직관적이며, 조건이 복잡해지더라도 가독성을 유지하기 쉽습니다.
- filter() + lambda: 코드가 짧아지고 함수형 프로그래밍 스타일에 적합합니다. 간단한 조건일 때 특히 유용합니다.
데이터 전처리 과정에서 유효하지 않거나 음수인 수치를 걸러내야 할 때, 위 두 가지 접근 방식을 상황에 맞게 활용해 보시기 바랍니다.