본문 바로가기

나 취준생/파이썬

Pandas 조인, 서브 쿼리, 그룹 함수의 비교

320x100

예제 : 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']])



하지만 이렇게 조인 시킬 때 how='right'라고 기입하면,



알아서 이렇게 아우터 조인이 된다.


반대쪽으로 왼쪽으로 아우터 조인할 때는 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')])




반응형