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']]
}
)
- 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]
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'}]
- age 때와 마찬가지로 조건을 적었는데 이번엔 TypeError가 뜹니다...
4. age 조건은 잘 작동한 이유
5. food 조건은 에러가 났던 이유
- people['food']는 element들의 값이 list 타입이어서 unhashable 해서 set로 형변환이 불가능하다는 말입니다.
> hashable의 설명은 길어지므로 생략합니다.
- 이는 아래 현상과 동일합니다.
6. 해결(list comprehension)
- 리스트 표현식(list comprehension)을 사용합니다.
- 리스트 표현식의 간단한 예는 아래와 같습니다.
- 해결 코드입니다.
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']]]
- 조건식으로 사용된 리스트 표현식을 사용하면, 결국 우리가 원하는 결과의 리스트 형태가 나오게 됩니다.
'프로그래밍 > Python' 카테고리의 다른 글
[30 Days of Streamlit] Day2. 첫 Streamlit App 실행 (0) | 2023.06.06 |
---|---|
[30 Days of Streamlit] Day1. 환경 설정 (0) | 2023.06.06 |
[Python] 자주 사용하는 String Format 정리[feat. locals()] (0) | 2023.05.19 |
[Python] 버퍼를 이용해 input에 자동으로 입력하기 (0) | 2023.05.07 |
[PyCharm] Exception에 밑줄 처리하기 (0) | 2023.05.03 |
댓글