데이터 분석을 하다 보면 하나의 시리즈(Series) 안에 정수, 실수, 문자열처럼 서로 다른 데이터 타입이 섞여 있는 경우를 자주 마주하게 됩니다. 이 글에서는 pandas의 filter() 함수와 lambda 표현식을 활용해 각 데이터 타입별 요소 개수를 손쉽게 계산하는 방법을 단계별로 살펴보겠습니다.
문제 정의
입력 − 다음과 같은 시리즈가 있다고 가정합니다.
0 1 1 2 2 python 3 3 4 4 5 5 6 6.5
출력 −
정수, 실수, 문자열 요소의 총 개수는, integer count: 5 float count: 1 string count: 1
해결 방법
이 문제는 아래 단계를 순서대로 따라 하면 해결할 수 있습니다.
리스트 데이터로 시리즈(Series)를 생성합니다.
lambda와filter()메서드를 조합해 정수(int) 타입의 요소만 걸러낸 뒤, 그 개수를len()으로 구합니다.
len(pd.Series(filter(lambda x:type(x)==int,data)))
같은 방식으로 실수(float) 타입 요소의 개수를 구합니다.
len(pd.Series(filter(lambda x:type(x)==float,data)))
마지막으로 문자열(str) 타입 요소의 개수를 구합니다.
len(pd.Series(filter(lambda x:type(x)==str,data)))
전체 코드 예제
import pandas as pd
ls = [1, 2, "python", 3, 4, 5, 6.5]
data = pd.Series(ls)
print("integer count:", len(pd.Series(filter(lambda x: type(x) == int, data))))
print("float count:", len(pd.Series(filter(lambda x: type(x) == float, data))))
print("string count:", len(pd.Series(filter(lambda x: type(x) == str, data))))
실행 결과
integer count: 5 float count: 1 string count: 1
코드 동작 원리 이해하기
여기서 핵심 역할을 하는 것은 filter() 함수입니다. filter(lambda x: type(x) == int, data)는 시리즈의 각 요소 x에 대해 type(x)가 int인 경우만 골라내는 이터레이터를 반환합니다. 이를 다시 pd.Series()로 감싸고 len()으로 길이를 확인하면 해당 타입의 요소 개수를 알 수 있습니다.
참고로 리스트에는 정수 5개(1, 2, 3, 4, 5), 실수 1개(6.5), 문자열 1개("python")가 들어 있으므로 위와 같은 결과가 출력됩니다.
대안: value_counts() 활용하기
조금 더 간결한 방법으로는 map(type)과 value_counts()를 조합하는 방식도 있습니다.
print(data.map(type).value_counts())
<class 'int'> 5 <class 'str'> 1 <class 'float'> 1 dtype: int64
이 방법은 모든 타입의 개수를 한 번에 확인할 수 있어, 데이터에 어떤 타입이 있는지 미리 알 수 없을 때 특히 유용합니다. 상황에 맞게 두 가지 방식을 선택해서 사용하시면 됩니다.