예제 : emp, dept 테이블 전체 조회하기
SQL > select * from emp;
select * from dept;
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") print(emp) dept=pd.read_csv("c:\\data\\dept3.csv") print(dept) |
예제 : DALLAS의 부서번호와 부서명을 출력하기
SQL > select deptno, dname
from dept
where loc='DALLAS';
1 2 3 4 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") print(dept[['deptno','dname']][dept['loc']=='DALLAS']) |
# Pandas를 활용한 조인
예제 : 이름과 부서 위치를 출력하기
SQL > select e.ename, d.loc
from emp e, dept d
where e.deptno=d.deptno;
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','loc']]) |
* emp 데이터 프레임과 dept 데이터 프레임을 merge를 써서 조인시키는데
on='deptno'를 이용해서 연결고리가 되는 컬럼을 지정해주면 된다.
그리고 그 조인해 만든 데이터 프레임에서 ename과 loc만 조회했다.
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result) |
조건을 안 줘보고 result 그대로 출력만 해보면 이해하기 쉽다.
보기와 같은 데이터 프레임에서 ename과 loc만 조회해서 출력한 것이다.
예제 : DALLAS에서 근무하는 사원들의 이름과 부서위치를 출력하기
SQL > select e.ename, d.loc
from emp e, dept d
where d.loc='DALLAS';
1 2 3 4 5 6 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','loc']][result['loc']=='DALLAS']) |
예제 : 월급이 3000 이상인 사원들의 이름과 월급과 부서 위치를 출력하기
SQL > select e.ename, e.sal, d.loc
from emp e, dept d
where e.sal>=3000;
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','sal','loc']][result['sal']>=3000]) |
예제 : 부서번호가 10번, 20번인 사원들의 이름과 부서위치와 부서번호를 출력하기
SQL > select e.ename, d.loc, d.deptno
from emp e, dept d
where d.deptno in (10,20);
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','loc','deptno']][result['deptno'].isin([10,20])]) |
데이터 프레임에서는 in (10,20) 하면 오류가 나고, 반드시 isin을 사용한 뒤
( 괄호를 열고, [ 리스트 안에 조건들을 기입해야한다. ] )
예제 : 월급이 1000에서 3000 사이인 사원들의 이름과 월급과 부서위치를 출력하기
SQL > select e.ename, e.sal, d.loc
from emp e, dept d
where e.sal between 1000 and 3000;
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','sal','loc']][result['sal'].between(1000,3000)]) |
* .between(a,b) 해주면 된다.
# Pandas로 아우터 조인
예제 : 사원의 이름과, 부서 위치를 출력하는데, 특정 위치에 일치하는 사원이 없더라도 위치도 전부 출력하기
SQL > select e.ename, d.loc
from emp e, dept d
where e.deptno(+)=d.deptno;
조인할 때 정보가 모자란 쪽에 (+) 해주는 것이 국룰이다.
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno') print(result[['ename','loc']]) |
이렇게 하면, 원래는 13명의 사원만 출력된다.
1 2 3 4 5 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") dept=pd.read_csv("c:\\data\\dept3.csv") result=pd.merge(emp,dept, on='deptno',how='right') print(result[['ename','loc']]) |
알아서 이렇게 아우터 조인이 된다.
반대쪽으로 왼쪽으로 아우터 조인할 때는 right 대신 left를,
양쪽으로 아우터 조인하고 싶다면 outer를 입력해주면 된다.
# Pandas로 서브쿼리 구현
예제 : JONES보다 월급이 더 많은 사원의 이름과 월급 출력하기
SQL > select ename, sal
from emp
where sal > ( select sal
from emp
where ename='JONES');
1 2 3 4 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") j_sal=emp['sal'][emp['ename']=='JONES'].values[0] print(emp[['ename','sal']][emp['sal']>j_sal]) |
조건에 들어갈 변수를 만들 때 항상 .values[0]을 하도록 하자.
저게 없으면 j_sal은 int 값이 아닌 데이터 프레임 형태가 되기 때문에
이후 조건 절에 들어가면 오류가 발생한다.
예제 : SCOTT과 같은 직업인 사원들의 이름과 월급 출력하기
SQL > select ename, sal
from emp
where job = ( select job
from emp
where ename='SCOTT');
1 2 3 4 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") job=emp['job'][emp['ename']=='SCOTT'].values[0] print(emp[['ename','sal']][emp['job']==job]) |
예제 : 방금의 예제에서 SCOTT은 제외하고 출력하기
SQL > select ename, sal
from emp
where job = ( select job
from emp
where ename='SCOTT') and ename!='SCOTT';
1 2 3 4 | import pandas as pd emp = pd.read_csv("c:\\data\\emp3.csv") job=emp['job'][emp['ename']=='SCOTT'].values[0] print(emp[['ename','sal']][(emp['job']==job) & (emp['ename']!='SCOTT')]) |
'나 취준생 > 파이썬' 카테고리의 다른 글
자료형의 특정 조건 값만 추출해내는 함수 (filter) (0) | 2020.12.07 |
---|---|
오라클 그룹 함수를 Pandas로 (0) | 2020.12.04 |
파이썬 오류 처리 ( try~except, else, finally, exception as e, 특정 예외) (0) | 2020.12.03 |
클래스 생성자, self, 상속, 클래스 변수와 인스턴스 변수 차이점 (1) | 2020.12.03 |
가설 검정해주는 함수 만들어보기 (0) | 2020.12.02 |