포스팅 목차
134. Delete those records where no of employee in a particular department is less than 4?
* 특정 부서의 직원이 4명 미만인 부서에서 근무하고 있는 직원들의 정보를 삭제하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- Delete 구문 유사문제 : 99/119/120 / 134 / 135
- Having & Subquery 유사문제 : 110
- [데이터 추출] 특정 조건을 해당하는 데이터 삭제 - 비상관 서브쿼리(In), Having count()
- 데이터 전처리
(SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql)
|
1. Oracle(오라클)
서브쿼리를 사용하여서 emp테이블에서 부서원 수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 삭제한다.
Oracle Programming |
create table emp_copy as
select *
from emp;
delete from emp_copy
where deptno in (select deptno from emp_copy group by deptno having count(*) < 4 );
select *
from emp_copy;
서브쿼리를 사용하여서 emp테이블에서 부서원 수가 4명 이상인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 출력한다.
Oracle Programming |
select *
from emp
where deptno in (select deptno from emp group by deptno having count(*) >=4 );
2. Python Pandas(파이썬)
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, query() 함수를 사용하여서 사원수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 제외한(not 연산자 - ‘~’) 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
Python Programming |
emp[~ emp.deptno.isin(emp.groupby('deptno')['empno'].count().reset_index().query('empno < 4').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 |
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, query() 함수를 사용하여서 사원수가 4명 이상인 부서번호를 선택 후 해당 부서번호에서 근무하는 직원들의 정보를 출력한다.
Python Programming |
emp[emp.deptno.isin(emp.groupby('deptno')['empno'].count().reset_index().query('empno > 3').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 |
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 한 후 사원수가 4명 이상인 부서를 선택하고, 이 결과를 emp 테이블과 내부조인(Inner Join)으로 결합하여서 사원수가 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
Python Programming |
pd.merge( emp, (emp.groupby('deptno')['empno'].count().reset_index().query('empno > 3')),
how='inner', left_on=['deptno'], right_on=['deptno']).head()
Results |
empno_x | ename | job | mgr | hiredate | sal | comm | deptno | empno_y | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 | 5 |
1 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 5 |
2 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 | 5 |
3 | 7876 | ADAMS | CLERK | 7788.0 | 1983/01/12 | 1100 | NaN | 20 | 5 |
4 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 | 5 |
3. R Programming (R Package)
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, subset() 함수를 사용하여서 사원수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 제외한(not 연산자 - ‘!’) 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp[! emp$deptno %in% unlist( subset( aggregate(empno~deptno, emp, length),empno<4 )[, "deptno" ]) , ][1:5, ]
Results |
# A tibble: 5 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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, subset() 함수를 사용하여서 사원수가 4명 이상인 부서번호를 선택 후 해당 부서번호에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp[ emp$deptno %in% unlist( subset( aggregate(empno~deptno, emp, length),empno>3 )[, "deptno" ]) , ][1:5, ]
Results |
# A tibble: 5 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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 한 후 사원수가 4명 이상인 부서를 선택하고, 이 결과를 emp 테이블과 내부조인(Inner Join)으로 결합하여서 사원수가 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
merge( emp,
(subset( aggregate(empno~deptno, emp, length),empno>3 )),
by.x=c("deptno"),by.y=c("deptno"),all=F)[1:5, ]
Results |
deptno empno.x ename job mgr hiredate sal comm empno.y
1 20 7566 JONES MANAGER 7839 1981-04-02 2975 NA 5
2 20 7369 SMITH CLERK 7902 1980-12-17 800 NA 5
3 20 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 5
4 20 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 5
5 20 7902 FORD ANALYST 7566 1981-12-03 3000 NA 5
4. R Dplyr Package
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, dplyr::filter() 함수를 사용하여서 사원수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 제외한(not 연산자 - ‘!’) 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp %>%
dplyr::filter(! deptno %in% ( emp%>%
dplyr::group_by(deptno) %>%
dplyr::tally() %>%
dplyr::filter(n <4) %>%
dplyr::select(deptno) %>%
dplyr::pull() ) ) %>%
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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, dplyr::filter() 함수를 사용하여서 사원수가 4명 이상인 부서번호를 선택 후 해당 부서번호에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp %>%
dplyr::filter(deptno %in% ( emp%>%
dplyr::group_by(deptno) %>%
dplyr::tally() %>%
dplyr::filter(n >3) %>%
dplyr::select(deptno) %>%
dplyr::pull() ) ) %>%
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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 한 후 사원수가 4명 이상인 부서를 선택하고, 이 결과를 emp 테이블과 내부조인(Inner Join)으로 결합하여서 사원수가 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
emp %>%
dplyr::inner_join( emp %>%
dplyr::group_by(deptno) %>%
dplyr::tally() %>%
dplyr::filter(n > 3) , by = c('deptno' = 'deptno') ) %>%
head()
Results |
# A tibble: 6 x 9
empno ename job mgr hiredate sal comm deptno n
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <int>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 5
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 6
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 6
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 5
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 6
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 6
5. R sqldf Package
서브쿼리를 사용하여서 emp테이블에서 부서원 수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 삭제한다.
R Programming |
%%R
withmooc <- emp
withmooc <- sqldf(c(" delete from withmooc
where deptno in (select deptno from emp group by deptno having count(*) <4 )",
"select * from main.withmooc"))
withmooc %>% 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
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
서브쿼리를 사용하여서 emp테이블에서 부서원 수가 4명 이상인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 출력한다.
R Programming |
%%R
sqldf(" select *
from emp
where deptno in (select deptno from emp group by deptno having count(*) > 3) ")
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
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
6. Python pandasql Package
- 현재 pandasql에서 update/delete 제대로 작동 안 함.
Python Programming |
import copy
withmooc =copy.copy(emp)
withmooc_1 = ps.sqldf(" select * \
from withmooc \
where deptno in (select deptno from emp group by deptno having count(*) >=4 ) ")
withmooc_1.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
emp테이블(DT)에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, 사원수가 4명 미만인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 제외한(not 연산자 - ‘!’) 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[! deptno %in% DT[, .N, by = .(deptno)][N < 4]$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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 하고, 사원수가 4명 이상인 부서번호를 선택 후 해당 부서번호에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
DT[deptno %in% DT[, .N, by = .(deptno)][N > 3]$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
emp테이블에서 부서번호(‘deptno’) 별로 사원수를 카운트 한 후 사원수가 4명 이상인 부서를 선택하고, 이 결과를 emp 테이블(DT)과 DT 조인 방식으로 내부조인(Inner Join)을 수행하여서 사원수가 4명 이상인 부서에서 근무하는 직원들의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[DT[, .N, by = .(deptno)][N > 3], nomatch=NULL, on=.(deptno=deptno),][1:5, ]
Results |
empno ename job mgr hiredate sal comm deptno N
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 5
2: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 5
3: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 5
4: 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20 5
5: 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20 5
6: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 6
7: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 6
8: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 6
9: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 6
10: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 6
11: 7900 JAMES CLERK 7698 1981-12-03 950 NA 30 6
8. SAS Proc SQL
서브쿼리를 사용하여서 emp테이블에서 부서원 수가 4명 이상인 부서번호를 선택 후 해당 부서번호에 해당하는 직원들의 정보를 출력한다.
- 논리적 삭제(proc sql의 delete) 와 물리적 삭제;
- sas tip 확인;
- 삭제된 칼럼의 순위 재카운팅 필요;
SAS Programming |
%%SAS sas
PROC SQL;
create table EMP_copy as
select *
from EMP;
delete from EMP_copy
where deptno in (select deptno from EMP_copy group by deptno having count(*) < 4 );
QUIT;
PROC PRINT;RUN;
* 삭제(논리적 삭제) 후에도 물리적으로 14건의 데이터가 존재하고 있다.;
data tot_cnt;
if _n_ = 0 then set EMP_copy nobs=n1;
tot_cnt = n1;
keep tot_cnt;
run;
PROC PRINT data=tot_cnt;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 |
6 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
8 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
10 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
11 | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | . | 20 |
12 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 |
13 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
OBS | tot_cnt |
1 | 14 |
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_1 as
select *
from emp
where deptno in (select deptno from emp group by deptno having count(*) >= 4);
QUIT;
PROC PRINT;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 |
6 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
7 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
8 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
9 | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | . | 20 |
10 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 |
11 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
9. SAS Data Step
SAS Programming |
%%SAS sas
proc sort data=emp out=emp_1;
by deptno;
run;
proc summary data=emp nway;
class deptno;
var empno;
output out=emp_cnt(drop=_:) n=emp_cnt;
run;
proc sort data=emp_cnt out=emp_cnt_1;
by deptno;
run;
data STATSAS_2;
merge emp_1(in=a) emp_cnt_1(in=b);
by deptno;
if a = b;
if emp_cnt < 4 then delete;
run;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno | emp_cnt |
1 | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | . | 20 | 5 |
2 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 | 5 |
3 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 | 5 |
4 | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | . | 20 | 5 |
5 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 | 5 |
6 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 6 |
7 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 6 |
8 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 6 |
9 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 | 6 |
10 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 6 |
11 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 | 6 |
SAS Programming |
%%SAS sas
proc sort data=emp out=emp_1;
by deptno;
run;
proc summary data=emp nway;
class deptno;
var empno;
output out=emp_cnt(drop=_:) n=emp_cnt;
run;
proc sort data=emp_cnt out=emp_cnt_1;
by deptno;
run;
data STATSAS_2;
merge emp_1(in=a) emp_cnt_1(in=b);
by deptno;
if a = b;
if emp_cnt >= 4 then output;
run;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno | emp_cnt |
1 | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | . | 20 | 5 |
2 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 | 5 |
3 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 | 5 |
4 | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | . | 20 | 5 |
5 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 | 5 |
6 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 6 |
7 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 6 |
8 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 6 |
9 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 | 6 |
10 | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | 6 |
11 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 | 6 |
10. Python Dfply Package
Python Programming |
# [참고] 함수 사용. (52번 예제 참고)
@dfpipe
def pull_fun(df, column=-1):
return df.loc[:, column].item()
emp >> filter_by (~ X.deptno.isin( emp >>
group_by('deptno') >>
summarize(emp_cnt = X.empno.count()) >>
filter_by(X.emp_cnt<4) >>
select(X.deptno) >>
pull_fun("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 |
Python Programming |
emp >> filter_by ( X.deptno.isin( emp >>
group_by('deptno') >>
summarize(emp_cnt = X.empno.count()) >>
filter_by(X.emp_cnt > 3) >>
select(X.deptno) >>
pull_fun("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 |
Python Programming |
pd.merge( emp, (emp.groupby('deptno')['empno'].count().reset_index().query('empno > 3')),
how='inner', left_on=['deptno'], right_on=['deptno']).head()
Results |
empno_x | ename | job | mgr | hiredate | sal | comm | deptno | empno_y | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 | 5 |
1 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 5 |
2 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 | 5 |
3 | 7876 | ADAMS | CLERK | 7788.0 | 1983/01/12 | 1100 | NaN | 20 | 5 |
4 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 | 5 |
Python Programming |
@pipe
def inner_join_merge(df, other, left_on,right_on,suffixes):
joined = df.merge(other, how='inner', left_on=left_on,
right_on=right_on , suffixes=suffixes)
return joined
emp >> \
inner_join_merge( ( emp >> \
group_by('deptno') >>\
summarize(emp_cnt = X.empno.count()) >> \
filter_by(X.emp_cnt>3)), \
left_on=["deptno"], right_on=["deptno"], suffixes=['_x','_y']) >> \
head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | emp_cnt | |
0 | 7369 | SMITH | CLERK | 7902.0 | 1980/12/17 | 800 | NaN | 20 | 5 |
1 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 5 |
2 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 | 5 |
3 | 7876 | ADAMS | CLERK | 7788.0 | 1983/01/12 | 1100 | NaN | 20 | 5 |
4 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 | 5 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글