회문(palindrome)은 앞에서부터 읽어도 뒤에서부터 읽어도 동일한 문자열을 의미합니다. 예를 들어 'bob', 'hannah'처럼 거꾸로 읽어도 같은 이름이 여기에 해당합니다. 이 글에서는 판다스 데이터프레임의 'Name' 열에서 이러한 회문 이름만 골라내는 두 가지 방법을 단계별로 살펴보겠습니다.
기대 결과
회문 이름을 필터링하면 다음과 같은 결과가 출력됩니다.
Palindrome names are:
Id Name
0 1 bob
2 3 hannah방법 1: 리스트 컴프리헨션 활용
먼저 데이터프레임을 정의합니다.
리스트 컴프리헨션 안에 for 반복문을 작성하여 df['Name'] 열의 모든 값을 변수 i로 하나씩 접근하고, if 조건으로 i == i[::-1]인지 비교합니다. 조건을 만족하는 값만 리스트에 추가됩니다. 참고로 슬라이싱 [::-1]은 문자열을 뒤집는 파이썬의 가장 간결한 기법입니다.
l = [i for i in df['Name'] if(i==i[::-1])]
마지막으로 isin() 함수를 사용해 리스트에 담긴 값들이 df['Name'] 열에 존재하는지 확인하고, 해당 행만 필터링합니다.
df[df['Name'].isin(l)]
예제 코드
다음 전체 코드를 통해 더 쉽게 이해할 수 있습니다.
import pandas as pd
data = {'Id':[1,2,3,4,5],'Name':['bob','peter','hannah','james','david']}
df = pd.DataFrame(data)
print("DataFrame is:\n", df)
l = [i for i in df['Name'] if(i==i[::-1])]
print("Palindrome names are:\n", df[df['Name'].isin(l)])실행 결과
DataFrame is:
Id Name
0 1 bob
1 2 peter
2 3 hannah
3 4 james
4 5 david
Palindrome names are:
Id Name
0 1 bob
2 3 hannah방법 2: 람다와 filter 함수 활용
먼저 데이터프레임을 정의합니다.
filter 함수에 람다(lambda)를 적용하여 df['Name'] 열의 각 값을 reversed()로 뒤집은 결과와 원래 값이 같은지 비교합니다. 두 값이 일치하면 그 값을 결과 리스트에 저장합니다.
result = list(filter(lambda x:(x=="".join(reversed(x))),df['Name']))
마찬가지로 isin() 함수를 사용해 결과 리스트의 값들이 df['Name'] 열에 존재하는지 확인하여 최종 행을 추출합니다.
df[df['Name'].isin(result)]
예제 코드
다음 전체 코드를 직접 실행해 보면 이해에 도움이 됩니다.
import pandas as pd
data = {'Id':[1,2,3,4,5],'Name':['bob','peter','hannah','james','david']}
df = pd.DataFrame(data)
print("DataFrame is:\n", df)
result = list(filter(lambda x:(x=="".join(reversed(x))),df['Name']))
print("Palindrome names are:\n", df[df['Name'].isin(result)])실행 결과
DataFrame is:
Id Name
0 1 bob
1 2 peter
2 3 hannah
3 4 james
4 5 david
Palindrome names are:
Id Name
0 1 bob
2 3 hannah