포스팅 목차
131. Display those employees who are working in sales or research?
* 영업부서(‘SALES’) 또는 연구부서(‘RESEARCH’)에서 근무하고 있는 직원들의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In)
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서 코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.
Oracle Programming |
select *
from emp
where deptno in ( select deptno from dept where dname in ('SALES','RESEARCH') );
2. Python Pandas(파이썬)
부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 isin() 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.
Python Programming |
print(dept[dept['dname'].isin(['SALES','RESEARCH'])]['deptno'])
emp[emp['deptno'].isin(dept[dept['dname'].isin(['SALES','RESEARCH'])]['deptno'])].head()
Results |
1 20
2 30
Name: deptno, dtype: int64
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
3. R Programming (R Package)
부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 %in% 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.
R Programming |
%%R
# print( unlist( dept[ dept$dname %in% c('SALES','RESEARCH') , 'deptno' ] ) )
emp [ emp$deptno %in% unlist( dept[ dept$dname %in% c('SALES','RESEARCH') , 'deptno' ] ) , ] %>% head()
Results |
# A tibble: 11 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
7 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
8 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30
9 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20
10 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
11 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
4. R Dplyr Package
부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 dplyr::filter() 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.
R Programming |
%%R
# unlist(dept %>% dplyr::filter(dname %in% c('SALES','RESEARCH' )) %>% dplyr::select(deptno))
emp %>%
dplyr::filter( deptno %in% ( dept %>% dplyr::filter(dname %in% c('SALES','RESEARCH' )) %>%
dplyr::select(deptno) %>% unlist() )) %>%
head()
Results |
# A tibble: 6 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
5. R sqldf Package
서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.
R Programming |
%%R
sqldf(" select *
from emp
where deptno in (select deptno from dept where dname in('SALES','RESEARCH'));") %>% head()
Results |
empno ename job mgr hiredate sal comm deptno
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
6. Python pandasql Package
서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.
Python Programming |
ps.sqldf(" select * from emp \
where deptno in (select deptno from dept where dname in('SALES','RESEARCH'));").head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
7. R data.table Package
부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 %in% 함수를 사용하여서 직원정보테이블(EMP)에서 해당 부서코드(20,30)에서 근무하고 있는 직원들의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
# dept_DT[dname %in% c("SALES", "RESEARCH"), .(deptno)]
DT[ deptno %in% unlist(dept_DT[dname %in% c("SALES", "RESEARCH"), .(deptno)]) ][1:5, ]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
3: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
4: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
5: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
8. SAS Proc SQL
서브쿼리를 사용하여서 부서정보테이블(DEPT)에서 영업부서와 연구부서에 해당하는 부서코드(‘deptno’)를 선택 후 직원정보테이블(EMP)에서 해당 부서코드에서 근무하고 있는 직원들의 정보를 출력한다.
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select *
from emp
where deptno in ( select deptno from dept where dname in ('SALES','RESEARCH') );
QUIT;
PROC PRINT data=STATSAS_1(obs=5);RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | . | 20 |
2 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
3 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
4 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
5 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
9. SAS Data Step
SAS Programming |
%%SAS sas
PROC SORT DATA=EMP OUT=EMP_1;
BY deptno;
RUN;
DATA STATSAS_3;
MERGE EMP_1(IN=A) dept(where=(dname in ('SALES','RESEARCH')) IN=B);
BY deptno;
IF A AND B;
RUN;
PROC PRINT data=STATSAS_1(obs=5);RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | . | 20 |
2 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
3 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
4 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
5 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
10. Python Dfply Package
Python Programming |
# [참고] 함수 사용. (52번 예제 참고) : AttributeError: 'DataFrame' object has no attribute 'ix'
@pipe
def pull_list(df, column=-1):
return df.loc[:, column]
emp >> \
filter_by ( X.deptno.isin( dept >> filter_by(X.dname.isin(['SALES','RESEARCH'])) >> select(X.deptno) >> pull_list("deptno") ) ) >> \
head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글