Pandas와 SQL(Structured Query Language)은 의심할 여지 없이 데이터 과학자가 테이블 형식의 데이터 관리, 처리 및 분석을 위한 도구입니다. Pandas는 데이터 분석을 위한 인기 있는 Python 라이브러리인 반면, SQL은 데이터베이스와 상호 작용하기 위한 전체를 포괄하는 프로그래밍 언어입니다. Pandas와 SQL 사이의 공통점 중 하나는 둘 다 테이블 형식 데이터 작업을 위한 훌륭한 도구라는 것입니다. Pandas와 SQL은 기본적으로 테이블 형식 데이터를 처리하고 운영하는 데 사용되므로 둘을 사용하여 유사한 작업을 수행할 수 있습니다. 따라서 이번 포스팅에서는 데이터 과학자가 가장 일반적으로 사용하는 SQL 쿼리를 Pandas의 해당 작업으로 변환해 보겠습니다. 해당 작업을 위해 회사에서 근무하는 직원 35명에 대한 가상의 데이터 세트를 생성하였습니다. 데이터 세트는 직원 ID, 근무기간(Experiance_Years), 나이(Age), 성별(Gender), 급여(Salary), 총 7개 열로 구성되어 있습니다. 아래 파일을 다운받으셔서 아래 코드를 작성하며 실습하시면 됩니다.
해당 데이터를 기반으로 SQL에서 일반적으로 사용하는 쿼리문을 Pandas에서 Python 코드로 변환해 보겠습니다.
테이블의 처음 5개(또는 k) 행 표시
SQL에서는 아래와 같이 표시할 레코드 수를 선택하고 지정한 후 limit를 사용할 수 있습니다.
select * from tableName limit 5 ;
모든 데이터베이스 시스템이 limit 절을 지원하는 것은 아닙니다. 아래에는 몇 가지 데이터베이스 관리 시스템의 구문이 요약되어 있습니다.
— SQL Server
Select TOP k * from tableName ;
— MySQL
SELECT * FROM tableName LIMIT k ;
— Oracle 12
SELECT * FROM tableName
FETCH FIRST k ROWS ONLY ;
Pandas에서는 head 메서드를 사용하고 인수로 행 수를 전달하면 이 작업을 수행할 수 있습니다.
import pandas as pd
dataFrameName = pd.read_csv(“d:/Employee_Salary_Dataset.csv”)
dataFrameName.head(5)
하나 이상의 열에서 조건으로 선택
회사에서 일하는 여성 직원만 추출하고 싶다고 가정해 보겠습니다. SQL에서는 아래와 같이 where 절을 사용하여 이를 수행할 수 있습니다.
select * from tableName
where Gender = ‘Female’ ;
Pandas에서 다음과 같이 번역됩니다.
dataFrameName[dataFrameName.Gender == ‘Female’]
열의 하위 집합 선택
다음으로 테이블에서 ID, 성별(Gender) 및 연령(Age)만 선택하고 싶다면, SQL에서 다음과 같이 작업을 수행하시면 됩니다.
select ID, Gender, Age from tableName ;
다음과 같이 Pandas에서 유사한 필터링을 실행할 수 있습니다.
dataFrameName[[“ID”, “Gender”, “Age”]]
SQL 구문은 대소문자를 구분하지 않습니다. 그러나 Pandas의 구문은 대/소문자를 구분합니다. 따라서 열 이름은 원래 DataFrame에 표시되는 것과 동일한 형식과 대소문자로 지정해야 합니다.
열 값을 기준으로 레코드 정렬
이 작업에서는 급여의 내림차순으로 직원 데이터를 정렬해 보겠습니다. 다음과 같이 SQL의 order by 절을 사용하여 실행할 수 있습니다.
select * from tableName
order by salary DESC ;
Pandas에서는 아래와 같이 sort_values() 메서드를 사용하고 열을 인수로 전달할 수 있습니다.
dataFrameName.sort_values(“Salary”, ascending = False)
레코드 그룹화
그룹화는 테이블 형식의 데이터를 분석하는 동안 많이 사용되는 작업입니다. 성별에 따른 직원의 평균 급여와 직원 수를 구하고 싶다고 가정해 보겠습니다. 이는 아래와 같이 group by 절을 사용하여 수행할 수 있습니다.
select gender,
avg(salary) as avg_salary,
count(*) as count
from tableName
group by gender ;
Pandas에서는 groupby 메서드를 사용하고 다음과 같이 수행하면 됩니다.
dataFrameName.groupby(“Gender”).agg({“Salary”:’mean’, “ID”:’size’})
고유 레코드 수
다음으로 열의 개별 항목과 개수를 표시하는 방법을 살펴보겠습니다. SQL에서는 아래와 같이 DISTINCT 키워드를 사용하여 수행할 수 있습니다.
select distinct Gender
from tableName ;
select count(distinct Gender)
from tableName ;
Pandas에서 이를 수행하기 위해 series에서 unique() 및 nunique() 메서드를 호출할 수 있습니다.
테이블의 행 수
dataFrameName.Gender.unique()
마지막으로 SQL과 Pandas를 사용하여 테이블의 행 수를 찾는 방법을 살펴보겠습니다. SQL에서는 아래와 같이 count() 메서드를 사용하여 이를 수행할 수 있습니다.
select count(*)
from employee ;
Pandas에서 이는 행 수와 열 수를 모두 반환하는 DataFrame의 shape 속성으로 변환됩니다.
dataFrameName.shape
이번 포스팅에서는 몇 가지 SQL 쿼리를 살펴보고 Pandas에서 동일한 결과를 얻는 방법을 살펴보았습니다.
Pandas와 SQL은 기본적으로 테이블 형식 데이터를 처리하고 운영하는 데 사용되므로 두 가지를 사용하여 유사한 작업을 수행할 수 있습니다.
그러나 경험에 따르면 Pandas의 파이썬 구문으로 인해 크로스탭 컴퓨팅 및 복잡한 집계와 같은 복잡한 작업을 groupby 이후에 구현하는 것은 Pandas보다 SQL에서 더 어려울 수 있습니다. Pandas는 매우 직관적입니다.
마지막 SQL-to-Pandas 예제를 다시 살펴보면 SQL이 테이블의 행 수만 반환한다는 것을 알 수 있습니다. SQL을 사용하여 테이블의 열 수를 계산하려는 경우 방법이 복잡합니다. 반면 Pandas에서 이 작업을 수행하려면 DataFrame(shape)의 단일 속성을 사용하여 DataFrame의 행과 열의 수를 모두 확인할 수 있습니다.