본문 바로가기
프로그래밍/Python

[Python] 컬럼 type이 list인 DataFrame에서 subset 구하기

by onsil-thegreenhouse 2023. 5. 17.
반응형

DataFrame에서 값의 type이 list인 컬럼을 조건으로 subset 구하는 법을 알아보겠습니다. 우리가 흔히 쓰는 subset 방법이 값이 list 형식일 때는 통하지 않는데요, 사실 list 타입을 값으로 지니는 컬럼이 흔치 않기 때문에 subset 원리에 대해서 깊게 생각한 적 없으면 방법을 헤매는 경우가 많습니다.(저 포함...) 하지만 array 타입을 지원하는 DB를 사용하다 보면 이런 상황을 자주 마주하게 되는데요, 원리와 함께 방법을 알아보겠습니다.

 

 

 

 


1. 실습 DataFrame 준비

import pandas as pd

people = pd.DataFrame(
    {
        'Name': ['teemo', 'jinx', 'jax', 'riven'],
        'age': [10, 20, 30, 40],
        'food': [['apple', 'banana', 'coke'], ['apple', 'cake'], ['banana', 'coke', 'apple'], ['salad']]
    }
)

실습 DataFrame

- food 컬럼은 값의 type이 list입니다.(string 아닙니다..!)

 

 

 

2. 나이가 25살 이상인 subset 구하기

- 아래 방법은 우리가 흔히 사용하는 subset 방법입니다.

import pandas as pd

people = pd.DataFrame(
    {
        'Name': ['teemo', 'jinx', 'jax', 'riven'],
        'age': [10, 20, 30, 40],
        'food': [['apple', 'banana', 'coke'], ['apple', 'cake'], ['banana', 'coke', 'apple'], ['salad']]
    }
)

people_old = people[people['age'] > 25]

나이가 25살 이상인 subset

 

 

 

3. 좋아하는 음식이 'apple', 'coke', 'banana'인 subset 구하기

- 이제 food 컬럼을 조건에 이용해야 할 차례입니다.

- 저는 처음에 이런 방법을 떠올렸습니다.

    > 순서에 상관없이 'apple', 'coke', 'banana'를 포함해야 하니, food 컬럼을 set으로 변경해서, 그 변경한 값이 {'apple', 'coke', 'banana'}와 동일한 조건을 사용하면 되겠다!

- 그리고 아래와 같이 코드를 작성했습니다. 그리고 그 결과는?

import pandas as pd

people = pd.DataFrame(
    {
        'Name': ['teemo', 'jinx', 'jax', 'riven'],
        'age': [10, 20, 30, 40],
        'food': [['apple', 'banana', 'coke'], ['apple', 'cake'], ['banana', 'coke', 'apple'], ['salad']]
    }
)

people_old = people[set(people['food']) == {'apple', 'banana', 'coke'}]

list가 값인 컬럼을 포함한 DataFrame에서 subset 구할 시 에러

- age 때와 마찬가지로 조건을 적었는데 이번엔 TypeError가 뜹니다...

 

 

4. age 조건은 잘 작동한 이유

age 조건은 subset이 잘 구해진 이유

 

 

5. food 조건은 에러가 났던 이유

list 타입의 컬럼을 조건으로 사용하면 에러가 나는 이유

- people['food']는 element들의 값이 list 타입이어서 unhashable 해서 set로 형변환이 불가능하다는 말입니다.

    > hashable의 설명은 길어지므로 생략합니다.

- 이는 아래 현상과 동일합니다.

[Python] list를 요소로 가지는 list는 set으로 형변환이 불가능하다.

 

6. 해결(list comprehension)

- 리스트 표현식(list comprehension)을 사용합니다.

- 리스트 표현식의 간단한 예는 아래와 같습니다.

[Python] 간단한 리스트 표현식 예

- 해결 코드입니다.

import pandas as pd

people = pd.DataFrame(
    {
        'Name': ['teemo', 'jinx', 'jax', 'riven'],
        'age': [10, 20, 30, 40],
        'food': [['apple', 'banana', 'coke'], ['apple', 'cake'], ['banana', 'coke', 'apple'], ['salad']]
    }
)

people_old = people[[set(foods) == {'apple', 'banana', 'coke'} for foods in people['food']]]

- 조건식으로 사용된 리스트 표현식을 사용하면, 결국 우리가 원하는 결과의 리스트 형태가 나오게 됩니다.

리스트 표현식을 사용하여 list type 컬럼을 조건식으로 사용

반응형

댓글