본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 추출] 특정 조건을 해당하는 데이터 삭제 - 비상관 서브쿼리(In), Having count() - 134 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2022. 12. 19.

포스팅 목차

     

    134. Delete those records where no of employee in a particular department is less than 4?

     

    * 특정 부서의 직원이 4명 미만인 부서에서 근무하고 있는 직원들의 정보를 삭제하시오.


    (SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql)

    • Oracle : Delete 구문, 비상관 서브쿼리, Having count(*)
    • 파이썬 Pandas : isin(), NOT('~') 연산자, groupby(), count(), query(), pd.merge()
    • R 프로그래밍 : NOT('!') 연산자, unlist(), subset(), aggregate() 의 length, %in%, merge()
    • R Dplyr Package : NOT('!') 연산자, dplyr::tally(), dplyr::pull(), dplyr::inner_join()
    • R sqldf Package : Delete 구문, 비상관 서브쿼리, Having count(*)
    • Python pandasql Package : Delete 구문, 비상관 서브쿼리, Having count(*)
    • R data.table Package : %in%, NOT('!') 연산자, .N, DT Syntax 방식의 데이터 결합
    • SAS Proc SQL : Delete 구문, 비상관 서브쿼리, Having count(*), 논리적 삭제
    • SAS Data Step : proc summary 의 n, Merge 구문, IF 조건문, Delete 구문
    • Python Dfply Package : NOT('~') 연산자, summarize() 의 count(), @dfpipe & def 사용자 정의 함수(pull_fun)
    • 파이썬 Base 프로그래밍 :

     


    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 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글