HOWTO · Pandas

열이 Pandas의 특정 값과 일치하는 행 인덱스 가져 오기

이 기사에서는 열이 Pandas의 특정 값과 일치하는 행의 색인을 가져 오는 방법을 소개합니다.

이 페이지의 내용

조건에 맞는 행을 가져오려면 불리언 마스크를 만들어 DataFrame.loc에 전달합니다. 해당 행의 레이블만 가져오려면 같은 마스크를 DataFrame.index에 적용하고, 일반 Python 리스트가 필요하면 tolist()를 호출하세요. 인덱스 레이블은 행을 식별하며, 연속된 정수 위치일 필요는 없습니다. 하나의 마스크를 재사용하면 DataFrame에 사용자 지정 레이블이 있어도 행 선택과 레이블 선택이 서로 일치합니다. 이후 작업을 위해 조건에 맞는 레코드가 필요하면 DataFrame.loc를 사용하고, 레이블 자체가 결과라면 인덱스 표현식을 사용하세요.

Pandas에서 숫자 조건에 맞는 행 가져오기

이 예제는 열 B의 값이 19인 행을 선택한 다음, 열 C에 대한 OR 조건을 결합합니다. DataFrame.loc는 조건에 맞는 행을 반환하고, DataFrame.index는 그 행의 레이블을 반환합니다. 각 비교식을 괄호로 묶으면 결합된 불리언 조건이 명확해집니다. 실제 DataFrame에서는 예제의 열 이름과 값을 데이터에 맞게 바꾸세요. 마스크를 | 또는 &로 결합할 때 각 비교식을 괄호로 묶어야 Python이 각 불리언 Series에 의도한 연산을 적용합니다.

import numpy as np
import pandas as pd

np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

matches_b = df["B"] == 19
print(df.loc[matches_b])
print(df.index[matches_b].tolist())

matches_b_or_c = (df["B"] == 19) | (df["C"] == 19)
print(df.loc[matches_b_or_c])
print(df.index[matches_b_or_c].tolist())
    A   B  C   D
6   1  19  4  18
9  12  19  3   1
[6, 9]
     A   B   C   D
6    1  19   4  18
9   12  19   3   1
14  12  15  19   1
[6, 9, 14]

첫 번째 마스크는 B 값이 19인 행을 선택하며, 레이블은 [6, 9]입니다. 두 번째 마스크는 OR(|)을 사용하므로 B 또는 C 중 하나의 값이 19인 행을 선택하고, 레이블은 [6, 9, 14]입니다. 두 조건이 모두 참이어야 할 때는 괄호로 묶은 조건 사이에 &를 사용하세요. 이 값들은 행 위치가 아니라 인덱스 레이블이므로 DataFrame을 필터링했거나 사용자 지정 인덱스로 불러온 경우에도 의미가 유지될 수 있습니다. DataFrame.index는 메서드가 아니라 속성이며, tolist()는 특정 pandas 인덱스 클래스에 의존하지 않고 선택된 레이블을 Python 리스트로 변환합니다. 원래 레이블이 고유하지 않으면 조건에 맞는 각 행이 인덱스 레이블을 하나씩 제공하므로 결과에 같은 레이블이 반복될 수 있습니다. 코드와 출력 블록은 원문 바이트를 그대로 유지하므로, 그 안에 표시되는 영문 열 이름과 문자열 값은 영어로 남습니다.

Pandas에서 문자열이 일치하는 행의 인덱스 가져오기

문자열 필터도 같은 방식으로 적용합니다. 열을 전체 값과 비교해 정확히 일치하는 항목을 찾거나, str.contains를 사용해 부분 문자열을 찾을 수 있습니다. 셀의 전체 값이 일치해야 한다면 정확한 일치 비교를, 값에 다른 텍스트가 포함될 수 있다면 부분 문자열 검색을 사용하세요. 아래 예제는 조건에 맞는 행과 해당 레이블을 모두 가져옵니다. 부분 문자열 조건에는 소문자 rex가 사용되며, 이는 Tyrannosaurus rex에 같은 대소문자로 들어 있습니다.

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

exact_name = df["Name"] == "blue"
print(df.index[exact_name].tolist())
print(df.loc[exact_name])

name_contains_ha = df["Name"].str.contains("ha")
print(df.index[name_contains_ha].tolist())
print(df.loc[name_contains_ha])

name_contains_ha_and_type_contains_rex = name_contains_ha & df["Type"].str.contains("rex")
print(df.loc[name_contains_ha_and_type_contains_rex])
[0]
   Name     Type
0  blue  Raptors
[3, 4]
      Name               Type
3  charlie            Raptors
4    alpha  Tyrannosaurus rex
    Name               Type
4  alpha  Tyrannosaurus rex

정확히 일치하는 비교는 blue를 찾아 해당 레이블을 반환합니다. 부분 문자열 ha는 charlie와 alpha에 일치합니다. 여기에 Type 열의 rex 조건을 결합하면 alpha 행이 선택되고, 레이블은 [4]입니다. str.contains는 기본적으로 대소문자를 구분하므로 데이터의 대소문자에 맞추거나 case 옵션을 명시적으로 설정하세요. 두 조건이 모두 일치해야 하면 &로, 둘 중 하나만 일치해도 되면 |로 조건을 결합하고 각 비교식을 괄호로 묶으세요. 숫자 필터와 마찬가지로 행을 가져오려면 마스크를 DataFrame.loc에, 레이블을 가져오려면 DataFrame.index에 전달합니다. 열 이름과 비교 값을 바꾸면 정확한 일치 표현식을 다른 열에 적용할 수 있고, 부분 문자열 표현식도 검색 문자열만 바꾸면 같은 구조로 사용할 수 있습니다.