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

파이썬(Python)으로 데이터프레임에서 고유 접두사를 제거해 도시 열 요소 필터링하기


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)처럼 첫 글자가 유일한 도시는 필터링되어 제외됩니다.

이 문제는 다음 단계를 따라 해결할 수 있습니다.

해결 방법

  1. 데이터프레임을 정의합니다.

  2. City 열 값들의 첫 글자를 담아둘 빈 리스트를 생성합니다.

    l = []
    for x in df['City']:
        l.append(x[0])
  3. 중복된 첫 글자만 골라내기 위한 또 다른 빈 리스트를 생성합니다. for 루프와 if 조건문을 사용해 두 번 이상 등장하는 문자만 새 리스트에 추가합니다.

    l1 = []
    for j in l:
        if(l.count(j)>1):
            if(j not in l1):
                l1.append(j)
  4. 세 번째 빈 리스트를 만들고, City 열의 값을 순회하면서 각 도시의 첫 글자가 앞서 만든 리스트(l1)에 존재하는지 확인합니다. 조건을 만족하는 도시만 새 리스트에 추가합니다.

    l2 = []
    for x in df['City']:
        if(x[0] in l1):
            l2.append(x)
  5. 마지막으로 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)는 두 번 이상 등장하는 첫 글자를 모두 찾아냅니다. 이 방식은 반복문보다 실행 속도가 빠르기 때문에 대용량 데이터를 다룰 때 특히 유용합니다.