pandas 데이터프레임이 주어졌을 때, 다른 도시와 첫 글자가 겹치지 않는 고유한 접두사를 가진 도시 이름을 제거하면 아래와 같은 결과를 얻을 수 있습니다.
Id City 2 3 Kolkata 3 4 Hyderabad 6 7 Haryana 8 9 Kakinada 9 10 Kochin
'K'로 시작하는 Kolkata·Kakinada·Kochin과 'H'로 시작하는 Hyderabad·Haryana는 같은 첫 글자를 공유하는 도시가 있어 결과에 그대로 남습니다. 반면 Chennai(C), Delhi(D), Pune(P), Mumbai(M), Bengaluru(B)처럼 첫 글자가 유일한 도시는 필터링되어 제외됩니다.
이 문제는 다음 단계를 따라 해결할 수 있습니다.
해결 방법
데이터프레임을 정의합니다.
City 열 값들의 첫 글자를 담아둘 빈 리스트를 생성합니다.
l = [] for x in df['City']: l.append(x[0])
중복된 첫 글자만 골라내기 위한 또 다른 빈 리스트를 생성합니다. for 루프와 if 조건문을 사용해 두 번 이상 등장하는 문자만 새 리스트에 추가합니다.
l1 = [] for j in l: if(l.count(j)>1): if(j not in l1): l1.append(j)
세 번째 빈 리스트를 만들고, City 열의 값을 순회하면서 각 도시의 첫 글자가 앞서 만든 리스트(l1)에 존재하는지 확인합니다. 조건을 만족하는 도시만 새 리스트에 추가합니다.
l2 = [] for x in df['City']: if(x[0] in l1): l2.append(x)
마지막으로 isin() 메서드를 사용해 l2의 요소가 City 열에 실제로 존재하는지 확인하고, 조건에 맞는 행만 남긴 데이터프레임을 출력합니다. isin()은 특정 값 목록에 포함된 행만 선택할 때 유용한 pandas 함수입니다.
df[df['City'].isin(l2)]
예제 코드
지금까지의 과정을 하나의 완성된 코드로 정리하면 다음과 같습니다.
import pandas as pd
df = pd.DataFrame({'Id':[1,2,3,4,5,6,7,8,9,10],
'City':['Chennai','Delhi','Kolkata','Hyderabad','Pune','Mumbai','Haryana','Bengaluru','Kakinada','Kochin']
})
l = []
for x in df['City']:
l.append(x[0])
l1 = []
for j in l:
if(l.count(j)>1):
if(j not in l1):
l1.append(j)
l2 = []
for x in df['City']:
if(x[0] in l1):
l2.append(x)
print(df[df['City'].isin(l2)])
출력 결과
Id City 2 3 Kolkata 3 4 Hyderabad 6 7 Haryana 8 9 Kakinada 9 10 Kochin
참고: 벡터화 연산으로 더 간결하게
위 풀이는 파이썬 반복문을 사용하지만, pandas의 문자열 처리 기능을 활용하면 코드를 훨씬 간결하게 만들 수 있습니다.
first_chars = df['City'].str[0] duplicated_chars = first_chars[first_chars.duplicated(keep=False)].unique() print(df[first_chars.isin(duplicated_chars)])
str[0]은 각 도시 이름의 첫 글자를 한 번에 추출하고, duplicated(keep=False)는 두 번 이상 등장하는 첫 글자를 모두 찾아냅니다. 이 방식은 반복문보다 실행 속도가 빠르기 때문에 대용량 데이터를 다룰 때 특히 유용합니다.