Pandas Query¶
- Query함수를 사용하여 데이터 조건식 적용
In [1]:
import pandas as pd
In [2]:
# Set up data
dataset_url= "https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data"
df = pd.read_csv(dataset_url, names=['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety'], header=None)
df.reset_index(drop=True, inplace=True)
In [3]:
df.head(5)
Out[3]:
buying | maint | doors | persons | lug_boot | safety | |
---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc |
1 | vhigh | 2 | 2 | small | med | unacc |
2 | vhigh | 2 | 2 | small | high | unacc |
3 | vhigh | 2 | 2 | med | low | unacc |
4 | vhigh | 2 | 2 | med | med | unacc |
In [4]:
df.buying.value_counts()
Out[4]:
vhigh 432 high 432 med 432 low 432 Name: buying, dtype: int64
In [5]:
df.describe()
Out[5]:
buying | maint | doors | persons | lug_boot | safety | |
---|---|---|---|---|---|---|
count | 1728 | 1728 | 1728 | 1728 | 1728 | 1728 |
unique | 4 | 4 | 3 | 3 | 3 | 4 |
top | vhigh | 2 | 2 | small | low | unacc |
freq | 432 | 432 | 576 | 576 | 576 | 1210 |
pandas.DataFrame.query¶
DataFrame.query(expr, *, inplace=False, **kwargs)
- 조건 표현식(expr)은 비교연산(>, <= , == 등), 산술연산(and, or, not)을 포함하여 Pandas에서 제공하는 함수(isna() 등)을 사용할 수 있다.
In [6]:
# Basic usage
df.query("buying == 'vhigh'").head(5) # 가장 비싼 차
Out[6]:
buying | maint | doors | persons | lug_boot | safety | |
---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc |
1 | vhigh | 2 | 2 | small | med | unacc |
2 | vhigh | 2 | 2 | small | high | unacc |
3 | vhigh | 2 | 2 | med | low | unacc |
4 | vhigh | 2 | 2 | med | med | unacc |
- 위의 결과에서 눈여겨 봐야 할 점은 pandas query의 반환값은 DataFrame이라는 점이다.
- 이는 다음 블로그에서 살펴볼
eval
함수와 큰 차이점을 갖는다.
In [7]:
# Multiple conditions
df.query("buying == 'vhigh' and doors == '2'").head(5) # 2 도어 중 가장 비싼 차
Out[7]:
buying | maint | doors | persons | lug_boot | safety | |
---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc |
1 | vhigh | 2 | 2 | small | med | unacc |
2 | vhigh | 2 | 2 | small | high | unacc |
3 | vhigh | 2 | 2 | med | low | unacc |
4 | vhigh | 2 | 2 | med | med | unacc |
In [8]:
# Missing value
_a = df[df.buying.isna()]
# equals
_b = df.query("buying.isna()")
display(_a, _b)
buying | maint | doors | persons | lug_boot | safety |
---|
buying | maint | doors | persons | lug_boot | safety |
---|
In [9]:
# query함수는 문자열로 컬럼을 지정하기 때문에 컬럼에 공백이 있는 경우 백틱(`)을 사용한다.
def map_grade(x):
if x == 'vhigh':
return 1
elif x == 'high':
return 2
elif x == 'med':
return 3
else:
return 4
df['price grade'] = df.buying.apply(map_grade)
In [10]:
#df.query("price grade >= 3") # It will cause SyntaxError: invalid syntax
df.query("`price grade` >= 3").head(3)
Out[10]:
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
216 | med | 2 | 2 | small | low | unacc | 3 |
217 | med | 2 | 2 | small | med | unacc | 3 |
218 | med | 2 | 2 | small | high | unacc | 3 |
In [11]:
# in
_in = df.query("`price grade` in [1,2]").head(3)
# not in
_notin = df.query("`price grade` not in [1,2]").head(3)
display(_in, _notin)
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc | 1 |
1 | vhigh | 2 | 2 | small | med | unacc | 1 |
2 | vhigh | 2 | 2 | small | high | unacc | 1 |
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
216 | med | 2 | 2 | small | low | unacc | 3 |
217 | med | 2 | 2 | small | med | unacc | 3 |
218 | med | 2 | 2 | small | high | unacc | 3 |
In [12]:
# 사칙연산 적용
df.query("`price grade`*10 == 10").head(3)
Out[12]:
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc | 1 |
1 | vhigh | 2 | 2 | small | med | unacc | 1 |
2 | vhigh | 2 | 2 | small | high | unacc | 1 |
In [13]:
# 함수 적용
df.query("persons.str.upper() == 'BIG'").head(3)
Out[13]:
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
6 | vhigh | 2 | 2 | big | low | unacc | 1 |
7 | vhigh | 2 | 2 | big | med | unacc | 1 |
8 | vhigh | 2 | 2 | big | high | unacc | 1 |
In [14]:
# str.contains 함수 사용하여 like 조건 재현
df.query("buying.str.contains('high')", engine='python')
Out[14]:
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
0 | vhigh | 2 | 2 | small | low | unacc | 1 |
1 | vhigh | 2 | 2 | small | med | unacc | 1 |
2 | vhigh | 2 | 2 | small | high | unacc | 1 |
3 | vhigh | 2 | 2 | med | low | unacc | 1 |
4 | vhigh | 2 | 2 | med | med | unacc | 1 |
... | ... | ... | ... | ... | ... | ... | ... |
1507 | high | 5more | more | med | med | acc | 2 |
1508 | high | 5more | more | med | high | vgood | 2 |
1509 | high | 5more | more | big | low | unacc | 2 |
1510 | high | 5more | more | big | med | acc | 2 |
1511 | high | 5more | more | big | high | vgood | 2 |
864 rows × 7 columns
In [15]:
# Complex conditions ( 다중 조건 추출)
df.query("buying.str.contains('high') and (persons not in ['small', 'med'] or lug_boot == 'high')")
Out[15]:
buying | maint | doors | persons | lug_boot | safety | price grade | |
---|---|---|---|---|---|---|---|
2 | vhigh | 2 | 2 | small | high | unacc | 1 |
5 | vhigh | 2 | 2 | med | high | unacc | 1 |
6 | vhigh | 2 | 2 | big | low | unacc | 1 |
7 | vhigh | 2 | 2 | big | med | unacc | 1 |
8 | vhigh | 2 | 2 | big | high | unacc | 1 |
... | ... | ... | ... | ... | ... | ... | ... |
1505 | high | 5more | more | small | high | acc | 2 |
1508 | high | 5more | more | med | high | vgood | 2 |
1509 | high | 5more | more | big | low | unacc | 2 |
1510 | high | 5more | more | big | med | acc | 2 |
1511 | high | 5more | more | big | high | vgood | 2 |
480 rows × 7 columns
반응형
'python > Pandas' 카테고리의 다른 글
Pandas - Null Data 처리방법 ( ffill, bfill, mean, interpolate 차이 그래프 비교 ) (0) | 2021.03.05 |
---|---|
Pandas - 컬럼의 고유 값 및 고유값 count 찾기 - 이런저런 방법들! (0) | 2021.03.03 |