Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

주어진 판다스 시리즈에서 완전제곱수만 골라내는 파이썬 프로그램

문제 정의

입력

다음과 같은 판다스(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()를 조합하는 두 번째 방법이 더 유리합니다.