쿼리
판다스에서도 SQL 처럼 쿼리를 이용할 수 있는데, query
(참고링크) 메서드를 이용하면 된다.
query
메서드는 문자열 형태로 조건식을 입력받는다. 따라서 기존 조건식을 이용한 방법보다 더 직관적이다.
예를 들어서 df
데이터프레임에서 age
열이 10
이상인 행만 남긴다고 해보자. 기존 방식은 아래와 같을 것이다.
df = df[df["age"] >= 10]]
여기까지는 가독성에 큰 문제가 없다. 이제 조건을 더 추가해서 height
열이 150
이상인 행만 남겨보자.
df = df.loc[(df["age"] >= 10) & (df["height"] >= 150)]
나쁘지 않아 보이지만 query
를 이용하면 다음과 같이 나타낼 수 있다.
df = df.query("age >= 10 and height >= 150")
가독성이 훨씬 좋고, 사용하기도 편하다.
inplace
매개변수를 이용해서 원본 데이터프레임을 변경하도록 설정할 수도 있다. 이 경우 반환값은 None
이다. 예를 들어 위 조건을 다시 쓰면 다음과 같다.
df.query("age >= 10 and height >= 150", inplace=True)
문자열 형태 조건식에는 대표적으로 비교 연산자, 논리 연산자, in연산자가 있다.
비교 연산자는 ==
, !=
, >
, >=
, <
, <=
이다.
논리 연산자는 여러 조건을 검사할 때 사용되는데, and
와 &
가 동일하고, or
와 |
이 동일하다. 그리고 not
이 있다.
in 연산자는 특정 열에 대해 여러 조건을 검사하고 싶을 때 사용한다. in
, not in
이 있다. 참고로 in
은 ==
으로 사용 가능하고, not in
은 !=
으로도 사용 가능하다.
외부 변수 혹은 함수를 참조하고 싶다면 @
를 앞에 붙여 활용한다. 단 함수를 사용할 때 사용자 정의 함수가 아니라 max
같은 파이썬 기본 함수를 사용한다면 오류가 발생할 수 있으니 주의해야 한다.
만약 문자열 부분검색을 하고 싶다면 .str.contains
(참고링크), .str.startswith
(참고링크), .str.endswith
(참고링크) 등을 활용할 수 있다.
만약 사용하는 열 이름 혹은 변수 이름에 띄어쓰기가 있다면 백틱(`
)으로 감싸주어야 한다. 예를 들어 열 이름이 e-mail address
라 하고, @naver.com
으로 끝나는 이메일만 검색하려면 다음과 같이 query
를 사용해야 한다.
df.query("`email address`.str.endswith('@naver.com')")
참고로 인덱스를 사용하고 싶다면 index
를 열 이름처럼 사용하면 된다.
예시
대략 아래와 같은 df
데이터프레임이 있다고 가정하자.
name email address age account balance bank membership duration
0 Alice alice@gmail.com 21 8992503 Hana Bank 1
1 Bob bob@gmail.com 35 7227778 Shinhan Bank 20
2 Charlie charlie@gmail.com 55 1717715 KB Bank 10
3 David david@naver.com 60 5797641 Woori Bank 12
4 Eve eve@outlook.com 37 9370325 NH Bank 20
5 Frank frank@naver.com 41 2989960 Hana Bank 6
6 Grace grace@gmail.com 54 4780278 Woori Bank 5
7 Hannah hannah@naver.com 41 6556791 Hana Bank 17
8 Ivy ivy@gmail.com 31 1154215 NH Bank 15
9 Jack jack@gmail.com 30 9506940 Shinhan Bank 14
10 Kevin kevin@naver.com 44 9225578 KB Bank 2
11 Luna luna@daum.net 22 4009180 Shinhan Bank 3
12 Mike mike@gmail.com 55 2294952 Woori Bank 1
13 Nancy nancy@daum.net 48 5149479 KB Bank 12
14 Oscar oscar@daum.net 48 6176913 Shinhan Bank 15
15 Paul paul@outlook.com 24 9622417 Hana Bank 3
16 Quinn quinn@gmail.com 44 2221040 Hana Bank 12
17 Rachel rachel@naver.com 49 6788748 Woori Bank 19
18 Steve steve@naver.com 55 8928420 Hana Bank 19
19 Tracy tracy@gmail.com 26 8617524 KB Bank 15
20 Uma uma@gmail.com 22 750593 KB Bank 1
21 Victor victor@naver.com 58 5723707 KB Bank 15
22 Wendy wendy@naver.com 48 7425002 Woori Bank 8
23 Xavier xavier@daum.net 53 6695489 NH Bank 15
24 Yvonne yvonne@outlook.com 53 6561448 NH Bank 13
25 Zach zach@gmail.com 59 3599520 Hana Bank 7
26 Amy amy@daum.net 25 2936163 NH Bank 11
27 Brian brian@outlook.com 58 477639 Woori Bank 9
28 Clara clara@outlook.com 39 4215210 KB Bank 20
29 Derek derek@yahoo.com 50 2814876 Shinhan Bank 1
이제 query
를 이용해서 고객 정보를 추출해보자.
먼저 30
살 이상이면서 KB Bank
와 Hana Bank
를 이용하는 고객을 추출해보려면 다음과 같이 추출할 수 있다.
bank = ["KB Bank", "Hana Bank"]
df.query("bank in @bank and age >= 30")
결과는 아래와 같다.
name email address age account balance bank membership duration
2 Charlie charlie@gmail.com 55 1717715 KB Bank 10
5 Frank frank@naver.com 41 2989960 Hana Bank 6
7 Hannah hannah@naver.com 41 6556791 Hana Bank 17
10 Kevin kevin@naver.com 44 9225578 KB Bank 2
13 Nancy nancy@daum.net 48 5149479 KB Bank 12
16 Quinn quinn@gmail.com 44 2221040 Hana Bank 12
18 Steve steve@naver.com 55 8928420 Hana Bank 19
21 Victor victor@naver.com 58 5723707 KB Bank 15
25 Zach zach@gmail.com 59 3599520 Hana Bank 7
28 Clara clara@outlook.com 39 4215210 KB Bank 20
혹은 계좌 금액이 500000
이상이거나 가입기간이 15
이상인 고객 중 gamil.com
을 사용하는 고객만 뽑아보자.
df.query("(`account balance` >= 500000 or `membership duration` >= 15) and `email address`.str.endswith('@gmail.com')")
결과는 다음과 같다.
name email address age account balance bank membership duration
0 Alice alice@gmail.com 21 8992503 Hana Bank 1
1 Bob bob@gmail.com 35 7227778 Shinhan Bank 20
2 Charlie charlie@gmail.com 55 1717715 KB Bank 10
6 Grace grace@gmail.com 54 4780278 Woori Bank 5
8 Ivy ivy@gmail.com 31 1154215 NH Bank 15
9 Jack jack@gmail.com 30 9506940 Shinhan Bank 14
12 Mike mike@gmail.com 55 2294952 Woori Bank 1
16 Quinn quinn@gmail.com 44 2221040 Hana Bank 12
19 Tracy tracy@gmail.com 26 8617524 KB Bank 15
20 Uma uma@gmail.com 22 750593 KB Bank 1
25 Zach zach@gmail.com 59 3599520 Hana Bank 7
이러한 방식으로 query
를 이용하여 쉽게 데이터프레임에서 조건에 맞는 행을 뽑아낼 수 있다.
단 query
를 이용하면 loc
를 이용하는 것보다 비효율적이므로 주의해야 한다.
'Data Science > Data Processing' 카테고리의 다른 글
[Pandas] 데이터프레임 피벗 테이블(pivot table) (0) | 2025.03.05 |
---|---|
[Pandas] 데이터프레임 그룹화(groupby) (0) | 2025.03.04 |
[Pandas] 데이터프레임 새로운 열 할당(assign) 및 구간 나눠(cut, qcut) 새로운 열 만들기 (0) | 2025.03.03 |
[Pandas] 데이터프레임 중복 행 제거(drop duplicates) 및 특정 행 또는 열 제거(drop) (0) | 2025.03.02 |
[Pandas] 데이터프레임 인덱싱(loc, iloc) 및 단일값 접근(at, iat) (0) | 2025.01.17 |