문제 정의
입력 −
다음과 같은 판다스(Pandas) 시리즈가 있다고 가정해 보겠습니다.
0 14 1 16 2 30 3 49 4 80
출력 −
이 중 완전제곱수(perfect square)에 해당하는 요소만 필터링한 결과는 다음과 같습니다.
0 4 1 16 3 49
해결 방법 1: 반복문과 isin() 함수 활용
각 요소가 완전제곱수인지 하나씩 검사하여 목록을 만든 뒤, isin() 함수로 원래 시리즈에서 해당 값들만 추출하는 방법입니다.
판다스 시리즈를 정의합니다.
각 요소에 대해
math.sqrt()로 제곱근을 구하고, 여기에 0.5를 더한 뒤 정수 부분만 취해 다시 제곱합니다. 그 결과가 원래 값과 일치하면 해당 값은 완전제곱수입니다.마지막으로
isin()함수를 사용해 완전제곱수 목록에 포함된 값만 시리즈에서 선택합니다.
예제
import pandas as pd
import math as m
l = [4, 16, 30, 49, 80]
data = pd.Series(l)
print("Given series:")
print(data)
lis = []
for i in range(len(data)):
if data[i] == int(m.sqrt(data[i]) + 0.5) ** 2:
lis.append(data[i])
print("Perfect squares in the series:")
print(data[data.isin(lis)])출력
Given series: 0 4 1 16 2 30 3 49 4 80 dtype: int64 Perfect squares in the series: 0 4 1 16 3 49 dtype: int64
해결 방법 2: filter()와 람다 함수 활용
파이썬 내장 함수인 filter()와 람다(lambda) 함수를 조합하면 코드를 훨씬 간결하게 작성할 수 있습니다. 람다 식은 입력값 x의 제곱근을 반올림한 후 다시 제곱했을 때 원래 값과 동일한지를 검사하며, 조건을 통과한 값만 남깁니다.
예제
import pandas as pd
import math as m
l = [14, 16, 30, 49, 80]
data = pd.Series(l)
print("Given series:")
print(data)
result = pd.Series(filter(lambda x: x == int(m.sqrt(x) + 0.5) ** 2, l))
print(data[data.isin(result)])출력
Given series: 0 14 1 16 2 30 3 49 4 80 dtype: int64 Perfect squares: 1 16 3 49 dtype: int64
두 방법 모두 시리즈에서 완전제곱수만 정확히 걸러냅니다. 데이터 규모가 크지 않다면 어떤 방법을 사용해도 무방하지만, 코드의 가독성과 간결성 면에서는 람다 함수와 filter()를 조합하는 두 번째 방법이 더 유리합니다.