ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] Boolean Indexing 알아보기
    Python 2024. 4. 15. 06:24
    728x90
    반응형

     

    - 목차

     

    키워드.

    • Boolean Mask.
    • Selection.

     

    들어가며.

    Pandas DataFrame 에서 특정 Cell, Row, Column, Subset 를 획득하는 여러가지 방식이 존재합니다.

    그렇기 때문에 DataFrame 을 능숙하게 다루기 위해서 익숙해져야할 여러 요소들이 있습니다.

    이번 글에서는 DataFrame 에서 Subset 를 추출하는 여러가지 방식들에 대해서 알아보도록 하겠습니다.

     

     

    DataFrame Subset 추출하기.

    DataFrame 의 Subset 를 추출하기 위해서 사용되는 몇가지 방식을 소개합니다.

    1. Python List

    2. Series

    3. DataFrame

    세가지 방식이 존재합니다.

     

    먼저 DataFrame 을 생성합니다.

    Student 와 관련된 DataFrame 을 간단히 생성하였습니다.

    import pandas as pd
    
    students = [
    	["Aaron",24, "LA", False], 
    	["Bob", 44, "Seoul", True], 
    	["Chris", 14, "Seoul", False]
    ]
    columns = ["name", "age", "city", "marriage"]
    
    student_df = pd.DataFrame(students, columns = columns)
        name  age   city  marriage
    0  Aaron   24     LA     False
    1    Bob   44  Seoul      True
    2  Chris   14  Seoul     False

    Python List 를 활용하여 DataFrame Subset 추출하기.

    Python List 를 사용하여 DataFrame 의 특정 칼럼만을 추출할 수 있습니다.

    아래와 같이 Column 이름들로 구성된 Python List 를 사용하면 선택된 칼럼들로 구성된 DataFrame 의 Subset 를 추출할 수 있습니다.

    columns = [ "marriage", "city"] 
    student_df[columns]
       marriage   city
    0     False     LA
    1      True  Seoul
    2     False  Seoul

     

    Python List 가 아닌 칼럼명을 입력하게 되면 Pandas Series 가 출력됩니다.

    student_df[ "marriage" ]
    0    False
    1     True
    2    False
    Name: marriage, dtype: bool

     

    Series 를 활용하여 Subset 추출하기.

    Series 를 활용하여 원본 DataFrame 으로부터 Subset 를 추출할 수 있습니다.

    이 방식을 위해서는 Boolean Mask 생성하고, Boolean Mask 를 활용한 Boolean Indexing 을 적용합니다.

    이는 Numpy 의 ndarray 에서도 동일하게 적용되는 컨셉이며, 관련된 링크를 공유합니다.

    https://westlife0615.tistory.com/767

     

    [Numpy] Boolean Indexing 알아보기 ( Boolean Mask )

    - 목차 키워드.Boolean Indexing.Element-wise Calculation. 들어가며.Numpy 의 ndarray 는 Boolean Indexing 이라는 기능이 제공됩니다.만약 a = np.array([1,2,3,4,5]) 라는 ndarray 객체가 존재한다고 가정하겠습니다.a 는

    westlife0615.tistory.com

     

     

    추출하고자하는 Column 들을 True 와 False 로 구성한 Boolean Mask 를 생성합니다.

    그리고 아래와 같이 student_df 의 각 Row 에 아래와 같이 적용할 수 있습니다.

    "name", "city" 의 값은 False, "age", "marriage" 의 값은 True 로 설정하였구요.

    그 결과로서 age 와 marriage 정보만이 추출됩니다.

    import pandas as pd
    
    student_bool_mask = pd.Series(
        index=["name", "age", "city", "marriage"], 
        data=[False, True, False, True]
    )
    
    student_df.iloc[0][student_bool_mask]
    student_df.iloc[1][student_bool_mask]
    student_df.iloc[2][student_bool_mask]
    age            24
    marriage    False
    Name: 0, dtype: object
    
    age           44
    marriage    True
    Name: 1, dtype: object
    
    age            14
    marriage    False
    Name: 2, dtype: object

     

     

    DataFrame 를 활용하여 Subset 추출하기.

    Boolean Mask 를 구성하는 DataFrame 을 생성합니다.

    Boolean Mask 로 구성된 DataFrame 을 생성하는 방식은 간단합니다.

    DataFrame 과 Conditional Statement 를 적절히 결합하면 됩니다.

    예시는 아래와 같습니다.

     

    특정 칼럼의 값을 가지는 모든 Rows.

    아래 예시는 name 이 "Aaron" 또는 "Bob" 인 Pandas Series 를 생성하는 Boolean Mask 입니다.

    (student_df.name == "Aaron") | (student_df.name == "Bob")
    0     True
    1     True
    2    False
    Name: name, dtype: bool

     

    위 Boolean Mask 를 활용하여 name 이 "Aaron" 또는 "Bob" 인 Subset 를 추출할 수 있습니다.

    student_df[(student_df.name == "Aaron") | (student_df.name == "Bob")]
        name  age   city  marriage
    0  Aaron   24     LA     False
    1    Bob   44  Seoul      True

     

     

    특정 칼럼의 값을 제외한 모든 Rows.

    아래 조건은 "나이가 20세 초과인 학생이 아닌 경우". 즉, 10대인 학생을 조회하는 문장입니다.

    "~" Operator (tilde) 와 Pandas Series 가 결합되면 Series 의 값들은 모두 반전됩니다.

    ~(student_df.age > 20 )
    0    False
    1    False
    2     True
    Name: age, dtype: bool

     

    그래서 DataFrame 과 Series 를 결합하게 되면, 10대인 학생들로 구성된 Subset 를 추출할 수 있습니다.

    student_df[~(student_df.age > 20 )]
        name  age   city  marriage
    2  Chris   14  Seoul     False

     

     

    반응형
Designed by Tistory.