포스팅 목차
[데이터 관리] 10. Joining & Merging 데이터 프레임
1. Proc SQL
- 중복 시 SAS의 MERGE와 차이 발생
SAS Programming |
proc sql;
create table myleft as
select id,workshop,gender,q1,q2
from BACK.mydata;
create table myright as
select id,workshop,q3,q4
from BACK.mydata;
create table myshort(where=(NUM<=4)) as
select id,workshop,q3,q4,monotonic() as NUM
from BACK.mydata;
quit;
Results |
proc sql;
create table both as
select coalesce(a.id,b.id) as id,
coalesce(a.workshop,b.workshop) as workshop,
a.q1,a.q2,b.q3,b.q4
from myleft a , myright b
where a.id = b.id
and a.workshop = b.workshop;
select * from both;
quit;
SAS Programming |
id workshop q1 q2 q3 q4
----------------------------------------------------
1 1 1 1 5 1
2 2 2 1 4 1
3 1 2 2 4 3
4 2 3 1 . 3
5 1 4 5 2 4
6 2 5 4 5 5
7 1 5 3 4 4
8 2 4 5 5 5
INNER JOIN
SAS Programming |
proc sql;
create table both as
select coalesce(a.id,b.id) as id,
coalesce(a.workshop,b.workshop) as workshop,
a.q1,a.q2,b.q3,b.q4
from myleft a , myshort(drop=num) b
where a.id = b.id
and a.workshop = b.workshop;
select * from both;
quit;
Results |
id workshop q1 q2 q3 q4
----------------------------------------------------
1 1 1 1 5 1
2 2 2 1 4 1
3 1 2 2 4 3
4 2 3 1 . 3
LEFT JOIN
SAS Programming |
proc sql;
create table both as
select coalesce(a.id,b.id) as id,
coalesce(a.workshop,b.workshop) as workshop,
a.q1,a.q2,b.q3,b.q4
from myleft a left join myshort(drop=num) b
on a.id = b.id
and a.workshop = b.workshop;
select * from both;
quit;
Results |
id workshop q1 q2 q3 q4
----------------------------------------------------
1 1 1 1 5 1
2 2 2 1 4 1
3 1 2 2 4 3
4 2 3 1 . 3
5 1 4 5 . .
6 2 5 4 . .
7 1 5 3 . .
8 2 4 5 . .
RIGHT JOIN
SAS Programming |
proc sql;
create table both as
select coalesce(a.id,b.id) as id,
coalesce(a.workshop,b.workshop) as workshop,
a.q1,a.q2,b.q3,b.q4
from myleft a right join myshort(drop=num) b
on a.id = b.id
and a.workshop = b.workshop;
select * from both;
quit;
Results |
id workshop q1 q2 q3 q4
----------------------------------------------------
1 1 1 1 5 1
2 2 2 1 4 1
3 1 2 2 4 3
4 2 3 1 . 3
2. SAS Programming
- 테스트 데이터 생성;
SAS Programming |
DATA myleft(KEEP=id workshop gender q1 q2)
myright(KEEP=id workshop q3 q4)
myshort(KEEP=id workshop q3 q4);
SET BACK.mydata;
output myleft;
output myright;
if _n_ <=4 then output myshort;
run;
SAS Programming |
PROC SORT data=myleft;
BY id workshop;
RUN;
Results |
id workshop gender q1 q2
1 1 f 1 1
2 2 f 2 1
3 1 f 2 2
4 2 f 3 1
5 1 m 4 5
6 2 m 5 4
7 1 m 5 3
8 2 m 4 5
SAS Programming |
PROC SORT data=myright;
BY id workshop;
RUN;
Results |
id workshop q3 q4
1 1 5 1
2 2 4 1
3 1 4 3
4 2 . 3
5 1 2 4
6 2 5 5
7 1 4 4
8 2 5 5
SAS Programming |
PROC SORT data=myshort;
BY id workshop;
RUN;
Results |
id workshop q3 q4
1 1 5 1
2 2 4 1
3 1 4 3
4 2 . 3
- 정렬된 데이터 세트를 가로 결합;
SAS Programming |
DATA both;
MERGE myleft myright;
BY id workshop;
RUN;
Results |
id workshop gender q1 q2 q3 q4
1 1 f 1 1 5 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 . 3
5 1 m 4 5 2 4
6 2 m 5 4 5 5
7 1 m 5 3 4 4
8 2 m 4 5 5 5
- 각 결합에 대한 예제;
- Inner join, Left Join, Right Join;
SAS Programming |
data innerjoin leftjoin rightjoin join_a join_b;
merge myleft(in=a) myshort(in=b);
by id workshop;
if a and b then output innerjoin;
if a then output leftjoin;
if b then output rightjoin;
if a and b =0 then output join_a;
if a = 0 and b then output join_b;
run;
Results |
* INNER JOIN;
id workshop gender q1 q2 q3 q4
1 1 f 1 1 5 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 . 3
* LEFT JOIN;
id workshop gender q1 q2 q3 q4
1 1 f 1 1 5 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 . 3
5 1 m 4 5 . .
6 2 m 5 4 . .
7 1 m 5 3 . .
8 2 m 4 5 . .
* RIGTH JOIN;
id workshop gender q1 q2 q3 q4
1 1 f 1 1 5 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 . 3
* JOIN_A;
id workshop gender q1 q2 q3 q4
5 1 m 4 5 . .
6 2 m 5 4 . .
7 1 m 5 3 . .
8 2 m 4 5 . .
* JOIN_B
3. SPSS
SPSS Programming |
GET FILE='C:\mydata.sav'.
DELETE VARIABLES q3 to q4.
SAVE OUTFILE='C:\myleft.sav'.
EXECUTE .
GET FILE='C:\mydata.sav'.
DELETE VARIABLES workshop to q2.
SAVE OUTFILE='C:\myright.sav'.
EXECUTE .
GET FILE='C:\myleft.sav'.
MATCH FILES /FILE=*
/FILE='C:\myright.sav'
/BY id.
EXECUTE.
4. R Programming (R-PROJECT)
R Programming |
from rpy2.robjects import r
%load_ext rpy2.ipython
Results |
The rpy2.ipython extension is already loaded. To reload it, use:
%reload_ext rpy2.ipython
R Programming |
%%R
library(tidyverse)
library(psych)
mydata <- read_csv("C:/work/data/mydata.csv",
col_types = cols( id = col_double(),
workshop = col_character(),
gender = col_character(),
q1 = col_double(),
q2 = col_double(),
q3 = col_double(),
q4 = col_double()
)
)
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
Results |
R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
---------------------------------------
s = ffi.string(c, maxlen).decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 1: invalid start byte
R[write to console]: The following objects are masked from 'package:ggplot2':
%+%, alpha
Results |
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
R Programming |
%%R
myleft<-mydata[ c("id","workshop","gender","q1","q2") ]
myleft
Results |
# A tibble: 8 x 5
id workshop gender q1 q2
<dbl> <chr> <chr> <dbl> <dbl>
1 1 1 f 1 1
2 2 2 f 2 1
3 3 1 f 2 2
4 4 2 f 3 1
5 5 1 m 4 5
6 6 2 m 5 4
7 7 1 m 5 3
8 8 2 m 4 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
R Programming |
%%R
myright<-mydata[ c("id","workshop","q3","q4") ]
myright
Results |
# A tibble: 8 x 4
id workshop q3 q4
<dbl> <chr> <dbl> <dbl>
1 1 1 5 1
2 2 2 4 1
3 3 1 4 3
4 4 2 NA 3
5 5 1 2 4
6 6 2 5 5
7 7 1 4 4
8 8 2 5 5
- ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
- “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
R Programming |
%%R
both<-merge(myleft,myright,by="id")
both
Results |
id workshop.x gender q1 q2 workshop.y q3 q4
1 1 1 f 1 1 1 5 1
2 2 2 f 2 1 2 4 1
3 3 1 f 2 2 1 4 3
4 4 2 f 3 1 2 NA 3
5 5 1 m 4 5 1 2 4
6 6 2 m 5 4 2 5 5
7 7 1 m 5 3 1 4 4
8 8 2 m 4 5 2 5 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 원래의 데이터프레임과 동일하게 재생성한다.
R Programming |
%%R
both<-merge(myleft,myright,by=c("id","workshop"))
both
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
- 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
R Programming |
%%R
both<-merge(myleft,myright,by.x=c("id","workshop"),
by.y=c("id","workshop"))
print(both)
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
R Programming |
%%R
myshort<-myright[1:4,]
print(myshort)
Results |
# A tibble: 4 x 4
id workshop q3 q4
<dbl> <chr> <dbl> <dbl>
1 1 1 5 1
2 2 2 4 1
3 3 1 4 3
4 4 2 NA 3
- [INNER JOIN]
R Programming |
%%R
merge(myleft,myshort,by.x=c("id","workshop"),
by.y=c("id","workshop"),all=F)
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
- [LEFT JOIN]
R Programming |
%%R
merge(myleft,myshort,by.x=c("id","workshop"),
by.y=c("id","workshop"),all.x=T)
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 NA NA
6 6 2 m 5 4 NA NA
7 7 1 m 5 3 NA NA
8 8 2 m 4 5 NA NA
- [RIGHT JOIN]
R Programming |
%%R
merge(myleft,myshort,by.x=c("id","workshop"),
by.y=c("id","workshop"),all.y=T)
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
- [OUTER JOIN]
R Programming |
%%R
merge(myleft,myshort,by.x=c("id","workshop"),
by.y=c("id","workshop"),all=T)
Results |
id workshop gender q1 q2 q3 q4
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 NA NA
6 6 2 m 5 4 NA NA
7 7 1 m 5 3 NA NA
8 8 2 m 4 5 NA NA
5. R - Tidyverse
R Programming |
from rpy2.robjects import r
%load_ext rpy2.ipython
Results |
The rpy2.ipython extension is already loaded. To reload it, use:
%reload_ext rpy2.ipython
R Programming |
%%R
library(tidyverse)
library(psych)
mydata <- read_csv("C:/work/data/mydata.csv",
col_types = cols( id = col_double(),
workshop = col_character(),
gender = col_character(),
q1 = col_double(),
q2 = col_double(),
q3 = col_double(),
q4 = col_double()
)
)
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
Results |
R[write to console]: The following objects are masked from withmooc (pos = 3):
gender, id, q1, q2, q3, q4, workshop
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
R Programming |
%%R
myleft <- mydata %>%
select("id","workshop","gender","q1","q2")
myleft
Results |
# A tibble: 8 x 5
id workshop gender q1 q2
<dbl> <chr> <chr> <dbl> <dbl>
1 1 1 f 1 1
2 2 2 f 2 1
3 3 1 f 2 2
4 4 2 f 3 1
5 5 1 m 4 5
6 6 2 m 5 4
7 7 1 m 5 3
8 8 2 m 4 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
R Programming |
%%R
myright <- mydata %>%
select("id","workshop","q3","q4")
myright
Results |
# A tibble: 8 x 4
id workshop q3 q4
<dbl> <chr> <dbl> <dbl>
1 1 1 5 1
2 2 2 4 1
3 3 1 4 3
4 4 2 NA 3
5 5 1 2 4
6 6 2 5 5
7 7 1 4 4
8 8 2 5 5
- ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
- “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
- bind_cols 사용
R Programming |
%%R
myleft %>%
bind_cols(myright)
Results |
R[write to console]: New names:
* id -> id...1
* workshop -> workshop...2
* id -> id...6
* workshop -> workshop...7
# A tibble: 8 x 9
id...1 workshop...2 gender q1 q2 id...6 workshop...7 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 1 1 f 1 1 1 1 5 1
2 2 2 f 2 1 2 2 4 1
3 3 1 f 2 2 3 1 4 3
4 4 2 f 3 1 4 2 NA 3
5 5 1 m 4 5 5 1 2 4
6 6 2 m 5 4 6 2 5 5
7 7 1 m 5 3 7 1 4 4
8 8 2 m 4 5 8 2 5 5
R Programming |
%%R
bind_cols(myleft,myright)
Results |
R[write to console]: New names:
* id -> id...1
* workshop -> workshop...2
* id -> id...6
* workshop -> workshop...7
# A tibble: 8 x 9
id...1 workshop...2 gender q1 q2 id...6 workshop...7 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 1 1 f 1 1 1 1 5 1
2 2 2 f 2 1 2 2 4 1
3 3 1 f 2 2 3 1 4 3
4 4 2 f 3 1 4 2 NA 3
5 5 1 m 4 5 5 1 2 4
6 6 2 m 5 4 6 2 5 5
7 7 1 m 5 3 7 1 4 4
8 8 2 m 4 5 8 2 5 5
- inner_join 사용
R Programming |
%%R
both <- myleft %>%
inner_join(myright, by = "id")
both
Results |
# A tibble: 8 x 8
id workshop.x gender q1 q2 workshop.y q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <chr> <dbl> <dbl>
1 1 1 f 1 1 1 5 1
2 2 2 f 2 1 2 4 1
3 3 1 f 2 2 1 4 3
4 4 2 f 3 1 2 NA 3
5 5 1 m 4 5 1 2 4
6 6 2 m 5 4 2 5 5
7 7 1 m 5 3 1 4 4
8 8 2 m 4 5 2 5 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 원 데이터프레임으로 완벽하게 재생성한다.
R Programming |
%%R
both <- myleft %>%
inner_join(myright, by = c("id","workshop"))
both
Results |
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
- 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
R Programming |
%%R
both <- myleft %>%
inner_join(myright, by = c("id","workshop"))
both
Results |
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
R Programming |
%%R
both <- myleft %>%
inner_join(myright, by.x=c("id","workshop"),
by.y=c("id","workshop"))
both
Results |
Joining, by = c("id", "workshop")
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 2 4
6 6 2 m 5 4 5 5
7 7 1 m 5 3 4 4
8 8 2 m 4 5 5 5
- 실습 데이터 생성
R Programming |
%%R
myshort <- myright %>%
slice(1:4)
myshort
Results |
# A tibble: 4 x 4
id workshop q3 q4
<dbl> <chr> <dbl> <dbl>
1 1 1 5 1
2 2 2 4 1
3 3 1 4 3
4 4 2 NA 3
- [INNER JOIN]
R Programming |
%%R
myleft %>%
inner_join(myshort, by.x=c("id","workshop"),
by.y=c("id","workshop"))
Results |
Joining, by = c("id", "workshop")
# A tibble: 4 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
- [LEFT JOIN]
R Programming |
%%R
myleft %>%
left_join(myshort, by.x=c("id","workshop"),
by.y=c("id","workshop"))
Results |
Joining, by = c("id", "workshop")
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 NA NA
6 6 2 m 5 4 NA NA
7 7 1 m 5 3 NA NA
8 8 2 m 4 5 NA NA
- [RIGHT JOIN]
R Programming |
%%R
myleft %>%
right_join(myshort, by.x=c("id","workshop"),
by.y=c("id","workshop"))
Results |
Joining, by = c("id", "workshop")
# A tibble: 4 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
- [OUTER JOIN]
R Programming |
%%R
myleft %>%
full_join(myshort, by.x=c("id","workshop"),
by.y=c("id","workshop"))
Results |
Joining, by = c("id", "workshop")
# A tibble: 8 x 7
id workshop gender q1 q2 q3 q4
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 1 f 1 1 5 1
2 2 2 f 2 1 4 1
3 3 1 f 2 2 4 3
4 4 2 f 3 1 NA 3
5 5 1 m 4 5 NA NA
6 6 2 m 5 4 NA NA
7 7 1 m 5 3 NA NA
8 8 2 m 4 5 NA NA
6. Python - Pandas
Python Programming |
import pandas as pd
import numpy as np
import sweetviz as sv
mydata = pd.read_csv("C:/work/data/mydata.csv",sep=",",
dtype={'id':object,'workshop':object,
'q1':int, 'q2':int, 'q3':float, 'q4':int},
na_values=['NaN'],skipinitialspace =True)
withmooc= mydata.copy()
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
Python Programming |
myleft = withmooc[["id","workshop","gender","q1","q2"]]
myleft
Results |
id workshop gender q1 q2
0 1 1 f 1 1
1 2 2 f 2 1
2 3 1 f 2 2
3 4 2 f 3 1
4 5 1 m 4 5
5 6 2 m 5 4
6 7 1 m 5 3
7 8 2 m 4 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
Python Programming |
myright = withmooc[["id","workshop","q3","q4"]]
myright
Results |
id workshop q3 q4
0 1 1 5.0 1
1 2 2 4.0 1
2 3 1 4.0 3
3 4 2 NaN 3
4 5 1 2.0 4
5 6 2 5.0 5
6 7 1 4.0 4
7 8 2 5.0 5
- ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
- “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고,
- R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
Python Programming |
pd.merge(myleft, myright, how='inner', on=['id'])
Results |
id workshop_x gender q1 q2 workshop_y q3 q4
0 1 1 f 1 1 1 5.0 1
1 2 2 f 2 1 2 4.0 1
2 3 1 f 2 2 1 4.0 3
3 4 2 f 3 1 2 NaN 3
4 5 1 m 4 5 1 2.0 4
5 6 2 m 5 4 2 5.0 5
6 7 1 m 5 3 1 4.0 4
7 8 2 m 4 5 2 5.0 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 원 데이터프레임으로 완벽하게 재생성한다.
Python Programming |
pd.merge(myleft, myright, how='inner', on=['id','workshop'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
- 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
Python Programming |
# 실습 데이터 생성
myright1 = myright.rename(index=str, columns={"id": "id1","workshop": "workshop1","q3": "x3","q4": "x4"})
myright1
Results |
id1 workshop1 x3 x4
0 1 1 5.0 1
1 2 2 4.0 1
2 3 1 4.0 3
3 4 2 NaN 3
4 5 1 2.0 4
5 6 2 5.0 5
6 7 1 4.0 4
7 8 2 5.0 5
- 결합되는 두 테이블의 키가 되는 변수의 이름이 다르다면 left_on, right_on 인수를 사용하여 기준 열을 지정.
Python Programming |
pd.merge(myleft, myright1, how='inner', left_on=['id','workshop'], right_on=['id1','workshop1'])
Results |
id workshop gender q1 q2 id1 workshop1 x3 x4
0 1 1 f 1 1 1 1 5.0 1
1 2 2 f 2 1 2 2 4.0 1
2 3 1 f 2 2 3 1 4.0 3
3 4 2 f 3 1 4 2 NaN 3
4 5 1 m 4 5 5 1 2.0 4
5 6 2 m 5 4 6 2 5.0 5
6 7 1 m 5 3 7 1 4.0 4
7 8 2 m 4 5 8 2 5.0 5
- [INNER JOIN]
Python Programming |
# 실습데이터me
myshort = myright.iloc[:4,]
myshort
Results |
id workshop q3 q4
0 1 1 5.0 1
1 2 2 4.0 1
2 3 1 4.0 3
3 4 2 NaN 3
Python Programming |
pd.merge(myleft, myshort, how='inner', left_on=['id','workshop'], right_on=['id','workshop'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
- [LEFT JOIN]
Python Programming |
pd.merge(myleft, myshort, how='left', left_on=['id','workshop'], right_on=['id','workshop'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1.0
1 2 2 f 2 1 4.0 1.0
2 3 1 f 2 2 4.0 3.0
3 4 2 f 3 1 NaN 3.0
4 5 1 m 4 5 NaN NaN
5 6 2 m 5 4 NaN NaN
6 7 1 m 5 3 NaN NaN
7 8 2 m 4 5 NaN NaN
- [RIGHT JOIN]
Python Programming |
pd.merge(myleft, myshort, how='right', left_on=['id','workshop'], right_on=['id','workshop'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
- [OUTER JOIN]
Python Programming |
pd.merge(myleft, myshort, how='outer', left_on=['id','workshop'], right_on=['id','workshop'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1.0
1 2 2 f 2 1 4.0 1.0
2 3 1 f 2 2 4.0 3.0
3 4 2 f 3 1 NaN 3.0
4 5 1 m 4 5 NaN NaN
5 6 2 m 5 4 NaN NaN
6 7 1 m 5 3 NaN NaN
7 8 2 m 4 5 NaN NaN
7. Python - dfply
Python Programming |
import pandas as pd
from dfply import *
mydata = pd.read_csv("c:/work/data/mydata.csv",sep=",",
dtype={'id':object,'workshop':object,
'q1':int, 'q2':int, 'q3':float, 'q4':int},
na_values=['NaN'],skipinitialspace =True)
withmooc= mydata.copy()
# 모든 변수 선택하기.
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
Python Programming |
myleft = mydata >> select("id","workshop","gender","q1","q2")
myleft
Results |
id workshop gender q1 q2
0 1 1 f 1 1
1 2 2 f 2 1
2 3 1 f 2 2
3 4 2 f 3 1
4 5 1 m 4 5
5 6 2 m 5 4
6 7 1 m 5 3
7 8 2 m 4 5
- 두 개의 q변수를 포함한 데이터 프레임 생성.
Python Programming |
myright = mydata >> select("id","workshop","q3","q4")
myright
Results |
id workshop q3 q4
0 1 1 5.0 1
1 2 2 4.0 1
2 3 1 4.0 3
3 4 2 NaN 3
4 5 1 2.0 4
5 6 2 5.0 5
6 7 1 4.0 4
7 8 2 5.0 5
- ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
- “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
- bind_cols 사용
Python Programming |
myleft >> bind_cols(myright)
Results |
id workshop gender q1 q2 id workshop q3 q4
0 1 1 f 1 1 1 1 5.0 1
1 2 2 f 2 1 2 2 4.0 1
2 3 1 f 2 2 3 1 4.0 3
3 4 2 f 3 1 4 2 NaN 3
4 5 1 m 4 5 5 1 2.0 4
5 6 2 m 5 4 6 2 5.0 5
6 7 1 m 5 3 7 1 4.0 4
7 8 2 m 4 5 8 2 5.0 5
- inner_join 사용
Python Programming |
both = myleft >> inner_join(myright, by = "id")
both
Results |
id workshop_x gender q1 q2 workshop_y q3 q4
0 1 1 f 1 1 1 5.0 1
1 2 2 f 2 1 2 4.0 1
2 3 1 f 2 2 1 4.0 3
3 4 2 f 3 1 2 NaN 3
4 5 1 m 4 5 1 2.0 4
5 6 2 m 5 4 2 5.0 5
6 7 1 m 5 3 1 4.0 4
7 8 2 m 4 5 2 5.0 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 원 데이터프레임으로 완벽하게 재생성한다.
Python Programming |
both = myleft >> inner_join(myright, by = ["id","workshop"])
both
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
- ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
- 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
- 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
Python Programming |
both = myleft >> inner_join(myright, by = ["id","workshop"])
both
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
Python Programming |
bot= myleft >> inner_join(myright, left_on = ["id","workshop"],
right_on = ["id","workshop"])
both
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
6 7 1 m 5 3 4.0 4
7 8 2 m 4 5 5.0 5
- 실습 데이터 생성
Python Programming |
myshort = myright >> row_slice(list(range(0,4)))
myshort
Results |
id workshop q3 q4
0 1 1 5.0 1
1 2 2 4.0 1
2 3 1 4.0 3
3 4 2 NaN 3
- [INNER JOIN]
Python Programming |
myleft >> inner_join(myshort, left_on = ["id","workshop"],
right_on = ["id","workshop"])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
- [LEFT JOIN]
Python Programming |
myleft >> left_join(myshort, left_on = ["id","workshop"],
right_on = ["id","workshop"])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1.0
1 2 2 f 2 1 4.0 1.0
2 3 1 f 2 2 4.0 3.0
3 4 2 f 3 1 NaN 3.0
4 5 1 m 4 5 NaN NaN
5 6 2 m 5 4 NaN NaN
6 7 1 m 5 3 NaN NaN
7 8 2 m 4 5 NaN NaN
- [RIGHT JOIN]
Python Programming |
myleft >> right_join(myshort, left_on = ["id","workshop"],
right_on = ["id","workshop"])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1
1 2 2 f 2 1 4.0 1
2 3 1 f 2 2 4.0 3
3 4 2 f 3 1 NaN 3
- [OUTER JOIN]
Python Programming |
myleft >> full_join(myshort, left_on = ["id","workshop"],
right_on = ["id","workshop"])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.0 1.0
1 2 2 f 2 1 4.0 1.0
2 3 1 f 2 2 4.0 3.0
3 4 2 f 3 1 NaN 3.0
4 5 1 m 4 5 NaN NaN
5 6 2 m 5 4 NaN NaN
6 7 1 m 5 3 NaN NaN
7 8 2 m 4 5 NaN NaN
통계프로그램 비교 목록(Proc sql, SAS, SPSS, R 프로그래밍, R Tidyverse, Python Pandas, Python Dfply) |
[Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 |
반응형
'통계프로그램 비교 시리즈 > 데이터 전처리 비교' 카테고리의 다른 글
[데이터 관리] 12. 변수를 관측치로 전치후 원상태로 복구 (0) | 2022.01.15 |
---|---|
[데이터 관리] 11. Aggregating Or Summarizing 데이터 (0) | 2022.01.15 |
[데이터 관리] 9. Stacking & Concatenating & Adding Data Sets (0) | 2022.01.14 |
[데이터 관리] 8. By 또는 Split 파일 프로세싱 (0) | 2022.01.11 |
[데이터 관리] 7. 변수 Keeping과 Dropping (0) | 2022.01.10 |
댓글