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

[데이터 상하(UNION) 결합] 특정 조건을 만족하는 데이터 추출 - 변수명 변경 - 162 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2023. 1. 29.

포스팅 목차

     

    162. list out the all employees by name and number along with their manager’s name and number also display ‘No Manager’ who has no manager.

     

    * 사원 정보와 해당 관리자의 정보를 함께 출력한다. 해당 관리자가 없는 경우 관리자 이름에 ‘No Manager’를 출력하시오.


    • 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
    • 유사문제 : 114
    • 참고 프로그램 : 동적 프로그램 실행 - 154번,161번, 162번
    • [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 데이터 상하 결합(UNION), 변수명 변경
    • 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
    • Oracle : UNION, IS NULL
    • 파이썬 Pandas : pd.merge(), columns, str.rstrip(), rename(), copy.deepcopy(), pd.concat() 데이터 상하 결합
    • R 프로그래밍 : merge(), Grep(), names(), gsub(), colnames(), reshape::rename(), is.na(), union()
    • R Dplyr Package : dplyr::inner_join(), dplyr::rename_all(), dplyr::rename(), union()
    • R sqldf Package : UNION, IS NULL
    • Python pandasql Package : UNION, IS NULL
    • R data.table Package : DT Syntax 방식의 데이터 결합, is.na(), funion()
    • SAS Proc SQL : UNION, IS NULL
    • SAS Data Step : MERGE 구문, IF 조건문, SET 구문 - 데이터 상하 결합
    • Python Dfply Package : @pipe & def (inner_join_merge) 사용자 정의 함수, @pipe 와 def 사용자 정의 함수(rename_fun), literal_eval() 텍트스 형태의 파이썬 코드 동적 실행(exec 154번 참고), rename_fun, rename(), Union()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 사원번호(‘mgr_empno’)와 관리자명(‘ManagerName’)을 출력한다. 담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 표시한 후 세로결합(Union)으로 앞의 결과와 출력한다.

     

    Oracle Programming
    select e.empno,e.ename,
           m.empno as mgr_empno,
           m.ename as ManagerName 
    from   emp e, emp m 
    where  e.mgr = m.empno
    union 
    select empno,ename,
           mgr          as mgr_empno,
           'No Manager' as ManagerName
    from   emp 
    where  mgr is null;

     


    2. Python Pandas(파이썬)

    emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 관리자 이름(‘ManagerName’)을 추가하여 출력한다.

    • 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수명(변수명이 ‘_x’로 끝나는 변수명) 에서 str.rstrip() 함수를 사용하여서 접미어(‘_x’)를 제거한다.
    • rename() 함수를 사용하여 관리자 정보에 해당하는 정보를 조회한 오른쪽 테이블의 변수명(변수명이 ‘_y’로 끝나는 변수명)을 표시하기 위하여 접미어(‘_y’)가 추가된 관리자 이름(‘ename_y’)을 “ManagerName” 으로 변수명을 변경한다.

     

    Python Programming
    withmooc = pd.merge( emp, 
                         emp, 
                         how='inner', 
                         left_on=['mgr'], right_on=['empno'])[ lambda x: (col for col in x if (col.endswith('_x') | col.endswith('ename_y') )) ]
    
    withmooc.columns = withmooc.columns.str.rstrip('_x')
    
    withmooc = withmooc.rename(index=str, columns={"ename_y": "ManagerName"})
    
    withmooc.head()

     

    Results
      empno ename job mgr hiredate sal comm deptno ManagerName
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 FORD
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30 BLAKE
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30 BLAKE
    3 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30 BLAKE
    4 7844 TURNER SALESMAN 7698.0 1981/09/08 1500 0.0 30 BLAKE
    5 7900 JAMES CLERK 7698.0 1981/12/03 950 NaN 30 BLAKE
    6 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 KING
    7 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30 KING
    8 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10 KING
    9 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20 JONES
    10 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20 JONES
    11 7876 ADAMS CLERK 7788.0 1983/01/12 1100 NaN 20 SCOTT
    12 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10 CLARK

     


    담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 표시하여 출력한다.

     

    Python Programming
    import copy
    
    withmooc1 = emp[emp['mgr'].isna()]
    
    withmooc2 = copy.deepcopy(withmooc1)  # SettingWithCopyWarning 경과 메시지 제어
    withmooc2['ManagerName'] = 'No Manager'
    
    withmooc2

     

    Results
      empno ename job mgr hiredate sal comm deptno ManagerName
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10 No Manager

     


    위에서 생성한 2개의 결과를 세로결합(outer)을 수행하여 출력한다.

     

    Python Programming
    pd.concat([withmooc,withmooc2],join='outer').tail()  # union

     

    Results
      empno ename job mgr hiredate sal comm deptno ManagerName
    9 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20 JONES
    10 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20 JONES
    11 7876 ADAMS CLERK 7788.0 1983/01/12 1100 NaN 20 SCOTT
    12 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10 CLARK
    28 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10 No Manager

     


    3. R Programming (R Package)

    emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 관리자 이름(‘ename.y’)을 추가하여 출력한다.

    • 테이블 결합 후 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수들(변수명이 ‘.x’로 끝나는 변수명)과 관리자 정보에 해당하는 정보를 조회한 오른쪽 테이블의 변수(변수명이 ‘.y’로 끝나는 변수명) 중 관리자명(‘ename.y’)을 선택하여서 출력한다.
    • 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수명(변수명이 ‘.x’로 끝나는 변수명) 에서 gsub() 함수를 사용하여서 접미어(‘.x’)를 제거한다.
    • rename() 함수를 사용하여 관리자 이름(‘ename.y’)을 “ManagerName” 으로 변수명을 변경한다.

     

    R Programming
    %%R
    
    library(reshape)
    library(plyr)
    
    withmooc <- merge(emp, emp, by.x=c("mgr"),by.y=c("empno"),all=F)
    withmooc <- withmooc[,grep("mgr$|empno|.x$|ename.y$", names(withmooc))]
    withmooc
    colnames(withmooc) <- gsub('.x$','',colnames(withmooc))
    
    # withmooc <- plyr::rename(withmooc,c(ename.y="ManagerName"))
    withmooc <- reshape::rename(withmooc, c(ename.y="ManagerName"))
    
    withmooc[1:5, ]

     

    Results
       mgr empno ename      job   hiredate  sal comm deptno ManagerName
    1 7566  7788 SCOTT  ANALYST 1982-12-09 3000   NA     20       JONES
    2 7566  7902  FORD  ANALYST 1981-12-03 3000   NA     20       JONES
    3 7698  7499 ALLEN SALESMAN 1981-02-20 1600  300     30       BLAKE
    4 7698  7521  WARD SALESMAN 1981-02-22 1250  500     30       BLAKE
    5 7698  7900 JAMES    CLERK 1981-12-03  950   NA     30       BLAKE

     


    담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 할당하여 출력한다.

     

    R Programming
    %%R
    
    wihtmooc1 <- emp[is.na(emp$mgr)  ,  ]
    
    wihtmooc1['ManagerName'] <- 'No Manager'
    
    wihtmooc1

     

    Results
    # A tibble: 1 x 9
      empno ename job         mgr hiredate     sal  comm deptno ManagerName
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10 No Manager 

     


    위에서 생성한 2개의 결과를 세로결합(outer)을 수행하여 출력한다.

     

    R Programming
    %%R
    
    union(withmooc, wihtmooc1) %>% tail()

     

    Results
    # A tibble: 6 x 9
        mgr empno ename job       hiredate     sal  comm deptno ManagerName
      <dbl> <dbl> <chr> <chr>     <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7788  7876 ADAMS CLERK     1983-01-12  1100    NA     20 SCOTT      
    2  7839  7782 CLARK MANAGER   1981-01-09  2450    NA     10 KING       
    3  7839  7566 JONES MANAGER   1981-04-02  2975    NA     20 KING       
    4  7839  7698 BLAKE MANAGER   1981-03-01  2850    NA     30 KING       
    5  7902  7369 SMITH CLERK     1980-12-17   800    NA     20 FORD       
    6    NA  7839 KING  PRESIDENT 1981-11-17  5000    NA     10 No Manager 

     


    4. R Dplyr Package

    emp 테이블을 self join 형식으로 dplyr::inner_join() 함수를 사용하여 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 관리자 이름(‘ename.y’)을 추가하여 출력한다.

    • 테이블 결합 후 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수들(변수명이 ‘.x’로 끝나는 변수명)과 관리자 정보에 해당하는 정보를 조회한 오른쪽 테이블의 변수(변수명이 ‘.y’로 끝나는 변수명) 중 관리자명(‘ename.y’)을 선택하여서 출력한다.
    • 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수명(변수명이 ‘.x’로 끝나는 변수명) 에서 dplyr::rename_all() 함수를 사용하여서 접미어(‘.x’)를 제거한다.
    • 추가로 rename() 함수를 사용하여 관리자 이름(‘ename.y’)을 “ManagerName” 으로 변수명을 변경한다.

     

    R Programming
    %%R
    
    withmooc <- emp %>%
      dplyr::inner_join( emp, by = c('mgr' = 'empno') ) %>%
      dplyr::select(empno, ends_with('.x'), ename.y)    %>% 
      dplyr::rename_all(funs(sub('.x$', '' , .)))       %>%
      dplyr::rename(ManagerName = ename.y)
    
    withmooc[1:5, ]

     

    Results
    # A tibble: 13 x 8
       empno ename  job      hiredate     sal  comm deptno ManagerName
       <dbl> <chr>  <chr>    <date>     <dbl> <dbl>  <dbl> <chr>      
     1  7369 SMITH  CLERK    1980-12-17   800    NA     20 FORD       
     2  7499 ALLEN  SALESMAN 1981-02-20  1600   300     30 BLAKE      
     3  7521 WARD   SALESMAN 1981-02-22  1250   500     30 BLAKE      
     4  7566 JONES  MANAGER  1981-04-02  2975    NA     20 KING       
     5  7654 MARTIN SALESMAN 1981-09-28  1250  1400     30 BLAKE      
     6  7698 BLAKE  MANAGER  1981-03-01  2850    NA     30 KING       
     7  7782 CLARK  MANAGER  1981-01-09  2450    NA     10 KING       
     8  7788 SCOTT  ANALYST  1982-12-09  3000    NA     20 JONES      
     9  7844 TURNER SALESMAN 1981-09-08  1500     0     30 BLAKE      
    10  7876 ADAMS  CLERK    1983-01-12  1100    NA     20 SCOTT      
    11  7900 JAMES  CLERK    1981-12-03   950    NA     30 BLAKE      
    12  7902 FORD   ANALYST  1981-12-03  3000    NA     20 JONES      
    13  7934 MILLER CLERK    1982-01-23  1300    NA     10 CLARK      

     


    담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 할당하여 출력한다.

     

    R Programming
    %%R
    
    withmooc1 <- emp %>% 
                   filter(is.na(mgr)  ) %>% 
                   dplyr::mutate(ManagerName = 'No Manager') %>%
                   dplyr::select(-'mgr')
    withmooc1

     

    Results
    # A tibble: 1 x 8
      empno ename job       hiredate     sal  comm deptno ManagerName
      <dbl> <chr> <chr>     <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7839 KING  PRESIDENT 1981-11-17  5000    NA     10 No Manager 

     


    위에서 생성한 2개의 결과를 세로결합(outer)을 수행하여 출력한다.

     

    R Programming
    %%R
    
    withmooc %>% 
      union(withmooc1) %>%
      tail()

     

    Results
    # A tibble: 6 x 8
      empno ename  job       hiredate     sal  comm deptno ManagerName
      <dbl> <chr>  <chr>     <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7844 TURNER SALESMAN  1981-09-08  1500     0     30 BLAKE      
    2  7876 ADAMS  CLERK     1983-01-12  1100    NA     20 SCOTT      
    3  7900 JAMES  CLERK     1981-12-03   950    NA     30 BLAKE      
    4  7902 FORD   ANALYST   1981-12-03  3000    NA     20 JONES      
    5  7934 MILLER CLERK     1982-01-23  1300    NA     10 CLARK      
    6  7839 KING   PRESIDENT 1981-11-17  5000    NA     10 No Manager 

     


    5. R sqldf Package

    emp 테이블을 self join 형식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 사원번호(‘mgr_empno’)와 관리자명(‘ManagerName’)을 출력한다. 담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 표시한 후 세로결합(Union)으로 앞의 결과와 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select e.empno,e.ename,
                   m.empno as Manager,
                   m.ename as ManagerName 
            from   emp e,emp m 
            where  e.mgr = m.empno
            union 
            select empno,ename,
                   mgr          as Manager,
                   'No Manager' as ManagerName
            from   emp where mgr is null;") %>% tail(7)

     

    Results
       empno  ename Manager ManagerName
    1   7369  SMITH    7902        FORD
    2   7499  ALLEN    7698       BLAKE
    3   7521   WARD    7698       BLAKE
    4   7566  JONES    7839        KING
    5   7654 MARTIN    7698       BLAKE
    6   7698  BLAKE    7839        KING
    7   7782  CLARK    7839        KING
    8   7788  SCOTT    7566       JONES
    9   7839   KING      NA  No Manager
    10  7844 TURNER    7698       BLAKE
    11  7876  ADAMS    7788       SCOTT
    12  7900  JAMES    7698       BLAKE
    13  7902   FORD    7566       JONES
    14  7934 MILLER    7782       CLARK

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf(" select e.empno,e.ename,m.empno Manager,m.ename ManagerName      \
               from   emp e,emp m                                              \
               where  e.mgr=m.empno                                            \
               union                                                           \
               select empno,ename,mgr as Manager,'No Manager' as ManagerName   \
               from   emp where mgr is null; ").tail(7)

     


    Results
      empno ename Manager ManagerName
    7 7788 SCOTT 7566.0 JONES
    8 7839 KING NaN No Manager
    9 7844 TURNER 7698.0 BLAKE
    10 7876 ADAMS 7788.0 SCOTT
    11 7900 JAMES 7698.0 BLAKE
    12 7902 FORD 7566.0 JONES
    13 7934 MILLER 7782.0 CLARK

     


    7. R data.table Package

    emp 테이블을 DT 결합 방식으로 관리자 사원번호(‘mgr’)와 사원번호(‘empno’)을 기준으로 내부조인(Inner Join)을 수행하여서 담당 관리자가 존재하는 경우 담당 관리자의 관리자 이름(‘i.ename’)을 추가하여 출력한다.

    • 테이블 결합 후 사원정보에 해당하는 정보를 조회한 왼쪽 테이블의 변수들과 관리자 정보에 해당하는 정보를 조회한 오른쪽 테이블의 변수(변수명이 ‘i.’으로 시작하는 변수명) 중 관리자명(‘i.ename’)을 선택하여서 출력한다.
    • 관리자 이름(‘i.ename’) 변수명을 ‘ManagerName’ 변경하는 방식으로 신규 변수(‘ManagerName’)로 할당하여서 이름을 변경하는 방식과 data.table::setnames() 함수를 사용하여서 변경하는 방식이 있다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    withmooc = DT[DT, nomatch=NULL, on = .(mgr = empno), ][, c('i.ename' , colnames(DT)), with=FALSE][, ManagerName := i.ename][,!c("i.ename")]
    
    # data.table::setnames(withmooc,"i.ename", "ManagerName")  # 'i.ename'을 'ManagerName'으로 변경한다.
    withmooc

     

    Results
        empno  ename      job  mgr   hiredate  sal comm deptno ManagerName
     1:  7788  SCOTT  ANALYST 7566 1982-12-09 3000   NA     20       JONES
     2:  7902   FORD  ANALYST 7566 1981-12-03 3000   NA     20       JONES
     3:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30       BLAKE
     4:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30       BLAKE
     5:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30       BLAKE
     6:  7844 TURNER SALESMAN 7698 1981-09-08 1500    0     30       BLAKE
     7:  7900  JAMES    CLERK 7698 1981-12-03  950   NA     30       BLAKE
     8:  7934 MILLER    CLERK 7782 1982-01-23 1300   NA     10       CLARK
     9:  7876  ADAMS    CLERK 7788 1983-01-12 1100   NA     20       SCOTT
    10:  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20        KING
    11:  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30        KING
    12:  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10        KING
    13:  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20        FORD

     


    담당 관리자의 사원번호가 존재하지 않은 경우 관리자의 이름을 ‘No Manager’로 할당하여 출력한다.

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    # DT[is.na(mgr)][,ManagerName := mgr]
    
    withmooc1 <- DT[is.na(mgr)][, `:=`(ManagerName = "No Manager")]

     


    위에서 생성한 2개의 결과를 funion() 함수를 사용하여 세로결합(outer)을 수행하여 출력한다.

     

    R Programming
    %%R
    
    funion(withmooc,withmooc1)

     

    Results
        empno  ename       job  mgr   hiredate  sal comm deptno ManagerName
     1:  7788  SCOTT   ANALYST 7566 1982-12-09 3000   NA     20       JONES
     2:  7902   FORD   ANALYST 7566 1981-12-03 3000   NA     20       JONES
     3:  7499  ALLEN  SALESMAN 7698 1981-02-20 1600  300     30       BLAKE
     4:  7521   WARD  SALESMAN 7698 1981-02-22 1250  500     30       BLAKE
     5:  7654 MARTIN  SALESMAN 7698 1981-09-28 1250 1400     30       BLAKE
     6:  7844 TURNER  SALESMAN 7698 1981-09-08 1500    0     30       BLAKE
     7:  7900  JAMES     CLERK 7698 1981-12-03  950   NA     30       BLAKE
     8:  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10       CLARK
     9:  7876  ADAMS     CLERK 7788 1983-01-12 1100   NA     20       SCOTT
    10:  7566  JONES   MANAGER 7839 1981-04-02 2975   NA     20        KING
    11:  7698  BLAKE   MANAGER 7839 1981-03-01 2850   NA     30        KING
    12:  7782  CLARK   MANAGER 7839 1981-01-09 2450   NA     10        KING
    13:  7369  SMITH     CLERK 7902 1980-12-17  800   NA     20        FORD
    14:  7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10  No Manager

     


    8. SAS Proc SQL

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select e.empno,e.ename,
               m.empno as mgr_empno,
               m.ename as ManagerName 
        from   emp e, emp m 
        where  e.mgr = m.empno
        union 
        select empno,ename,
               mgr          as mgr_empno,
               'No Manager' as ManagerName
        from   emp 
        where  mgr is null;
    QUIT;
    PROC PRINT data=STATSAS_1(obs=5);RUN;

     

    Results
    OBS empno ename mgr_empno ManagerName
    1 7369 SMITH 7902 FORD
    2 7499 ALLEN 7698 BLAKE
    3 7521 WARD 7698 BLAKE
    4 7566 JONES 7839 KING
    5 7654 MARTIN 7698 BLAKE

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1(RENAME=MGR=MGR_EMPNO);
         BY MGR;
    RUN;
    PROC SORT DATA=EMP OUT=EMP_2(RENAME=(EMPNO=MGR_EMPNO ENAME=MANAGERNAME) KEEP=EMPNO ENAME);
         BY empno;
    RUN;
    
    DATA STATSAS_2(RENAME=MANAGERNAME_1=MANAGERNAME); 
     MERGE EMP_1(in=a) EMP_2(in=b);
         BY MGR_EMPNO;
         IF A AND B;
         LENGTH MANAGERNAME_1 $10.;
         MANAGERNAME_1 = MANAGERNAME;
         KEEP EMPNO ENAME MGR_EMPNO MANAGERNAME_1;
    RUN;
    
    DATA EMP3;
     SET EMP;
         ManagerName = 'No Manager';
         RENAME MGR  = MGR_EMPNO;
         KEEP EMPNO ENAME MGR ManagerName;
         WHERE mgr = .;
    RUN;
    
    DATA MGR_UNION;
     SET STATSAS_2 EMP3;
    RUN;
    
    PROC PRINT data=MGR_UNION(obs=5);RUN;

     

    Results
    OBS empno ename MGR_EMPNO MANAGERNAME
    1 7788 SCOTT 7566 JONES
    2 7902 FORD 7566 JONES
    3 7499 ALLEN 7698 BLAKE
    4 7521 WARD 7698 BLAKE
    5 7654 MARTIN 7698 BLAKE

     


    10. Python Dfply Package

     

    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
    
    @pipe
    def rename_fun(df, col_name):
        return df.rename(columns=col_name)
    
    from ast import literal_eval
    s =  '{'+','.join([ "'" + str(col) + "_x'" + ": '" + str(col) + "'"   for col in emp.columns ]) +'}'
    # print(s)
    
    emp >> \
      inner_join_merge(emp, left_on=['mgr'], right_on=['empno'], suffixes=["_x", "_y"]) >> \
      select(ends_with('_x'), X.ename_y, ~X.mgr_x) >> \
      rename_fun( literal_eval(s) ) >> \
      rename(ManagerName = X.ename_y)  >> \
      union ( emp >> \
                filter_by(X.mgr.isnull()) >> \
                mutate(ManagerName = 'No Manager') >> \
                select(~X.mgr)) >> \
      head()

     

    Results
      empno ename job hiredate sal comm deptno ManagerName
    0 7369 SMITH CLERK 1980/12/17 800 NaN 20 FORD
    1 7499 ALLEN SALESMAN 1981/02/20 1600 300.0 30 BLAKE
    2 7521 WARD SALESMAN 1981/02/22 1250 500.0 30 BLAKE
    3 7654 MARTIN SALESMAN 1981/09/28 1250 1400.0 30 BLAKE
    4 7844 TURNER SALESMAN 1981/09/08 1500 0.0 30 BLAKE

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트

    반응형

    댓글