포스팅 목차
[데이터 관리] 3. 결측값 할당을 위한 조건 변환
1. Proc SQL
SAS Programming |
proc sql;
select id,
workshop,
gender,
case when q1=5 then .
else q1 end "q1",
case when q2=5 then .
else q2 end "q2",
case when q3=5 then .
else q3 end "q3",
case when q4=5 then .
else q4 end "q4"
from BACK.mydata;
quit;
Results |
id workshop gender q1 q2 q3 q4
--------------------------------------------------------------
1 1 f 1 1 . 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 . 2 4
6 2 m . 4 . .
7 1 m . 3 4 4
8 2 m 4 . . .
SAS Programming |
proc sql;
select id,
workshop,
gender,
ifn(q1=5,.,q1)"q1",
ifn(q2=5,.,q2)"q2",
ifn(q3=5,.,q3)"q3",
ifn(q4=5,.,q4)"q4"
from BACK.mydata;
quit;
Results |
id workshop gender q1 q2 q3 q4
--------------------------------------------------------------
1 1 f 1 1 . 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 . 2 4
6 2 m . 4 . .
7 1 m . 3 4 4
8 2 m 4 . . .
2. SAS Programming
SAS Programming |
data withmooc;
set BACK.mydata;
* 관측값 5를 결측치로 전환.;
if q1=5 then q1=.;
if q2=5 then q2=.;
if q3=5 then q3=.;
if q4=5 then q4=.;
run;
proc print;run;
data withmooc;
set BACK.mydata;
* 배열을 사용하여서 한번에 결측치로 변환.;
array q q1-q4;
do over q;
if q=5 then q=.;
end;
run;
proc print;run;
3. SPSS
SPSS Programming |
* SPSS Program to Assign Missing Values.
GET FILE=("c:\mydata.sav")
MISSING q1 TO q4 (9).
SAVE OUTFILE=("c:\mydata.sav")
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)
load(file="C:/work/data/mydata.Rdata")
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
Results |
R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
From cffi callback <function _consolewrite_ex at 0x0000021561EFE4C0>:
Traceback (most recent call last):
File "C:\Users\BACK\anaconda3\lib\site-packages\rpy2\rinterface_lib\callbacks.py", line 131, in _consolewrite_ex
s = conversion._cchar_to_str_with_maxlen(buf, maxlen=n)
File "C:\Users\BACK\anaconda3\lib\site-packages\rpy2\rinterface_lib\conversion.py", line 130, in _cchar_to_str_with_maxlen
s = ffi.string(c, maxlen).decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 0: invalid start byte
R[write to console]: -- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
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 NA 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
- 결측치 값 할당을 위한 R-Project 프로그램.
- 직접 데이터 수정. 데이터 에디터 화면에서 데이터 수정.
R Programming |
%%R
fix(withmooc)
- 변수 q1이 5인 값에 대하여 세 번째 변수(q1)의 값을 결측치로 변경.
R Programming |
%%R
withmooc[q1==5,3] <- NA
withmooc
Results |
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
- 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.
R Programming |
%%R
withmooc = mydata
withmooc[q1==5,"q1"] <- NA
withmooc
Results |
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
- ifelsem함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.
R Programming |
%%R
withmooc = mydata
withmooc$q1 <- ifelse( q1 == 5, NA, withmooc$q1)
withmooc
Results |
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
- mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.
한 번에 |
%%R
withmooc = mydata
withmooc[withmooc==5] <- NA
withmooc
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
많은 변수를 변경하는 예제.
- 5의 값을 관측치로 변경하는 함수 생성.
R Programming |
%%R
My5isNA <- function(x) {x[x==5] <- NA; x}
- 단일 변수에 대하여 함수를 적용.
R Programming |
%%R
withmooc = mydata
withmooc$q1 <- My5isNA(q1)
withmooc
Results |
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
- 변수 리스트에 대하여 결측치 값을 할당.
- Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
R Programming |
%%R
withmooc = mydata
withmooc[c("q1","q2","q3","q4")] <- lapply(withmooc[c("q1","q2","q3","q4")], My5isNA)
withmooc
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- 변수명 지정 없이 연속적인 변수를 적용.
- 변수명 대신에 열 번호를 사용.
- q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
R Programming |
%%R
withmooc = mydata
withmooc[ 3:6 ] <- lapply( withmooc[ 3:6 ], My5isNA)
withmooc
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
- Which함수는 각 변수명의 열 번호를 발견.
R Programming |
%%R
withmooc = mydata
A <- which( names(mydata)=="q1" )
Z <- which( names(mydata)=="q4" )
withmooc[ A:Z ] <- lapply( withmooc[ A:Z ], My5isNA)
withmooc
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- 관측값 대체
- 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
R Programming |
%%R
withmooc = mydata
withmooc[is.na(withmooc$q3),"q3"] <- mean(withmooc$q3,na.rm=TRUE)
withmooc
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 5.000000 1
2 2 f 2 1 4.000000 1
3 1 f 2 2 4.000000 3
4 2 f 3 1 4.142857 3
5 1 m 4 5 2.000000 4
6 2 m 5 4 5.000000 5
7 1 m 5 3 4.000000 4
8 2 m 4 5 5.000000 5
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)
attach(mydata) # mydata를 기본 데이터 세트로 지정.
load(file="C:/work/data/mydata.Rdata")
withmooc = mydata
attach(withmooc) # mydata를 기본 데이터 세트로 지정.
withmooc
Results |
R[write to console]: The following objects are masked from withmooc:
gender, q1, q2, q3, q4, workshop
R[write to console]: The following objects are masked from withmooc (pos = 4):
gender, q1, q2, q3, q4, workshop
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 NA 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
- 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
한 번에 |
%%R
withmooc %>%
dplyr::mutate(q1 = ifelse(q1==5,NA,q1))
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
많은 변수를 변경하는 예제.
- 5의 값을 관측치로 변경하는 함수 생성.
R Programming |
%%R
My5isNA <- function(x) {x[x==5] <- NA; x}
- 단일 변수에 대하여 함수를 적용.
R Programming |
%%R
withmooc = mydata
withmooc %>%
dplyr::mutate(q1 = My5isNA(q1))
Results |
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 NA 3
5 1 m 4 5 2 4
6 2 m NA 4 5 5
7 1 m NA 3 4 4
8 2 m 4 5 5 5
- 변수 리스트에 대하여 결측치 값을 할당.
- Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_if(is.numeric, funs(My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- map : 각 변수 별로 함수 적용 후 하나의 테이블로 재구성됨.
R Programming |
%%R
withmooc = mydata
withmooc %>%
map(~ transmute(withmooc, {{.x}} := My5isNA(.))) %>%
as_tibble()
Results |
# A tibble: 8 x 6
workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
<int> <chr> <int> <int> <int> <int>
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
select(q1,q2,q3,q4) %>%
purrr::map_df(My5isNA)
Results |
# A tibble: 8 x 4
q1 q2 q3 q4
<int> <int> <int> <int>
1 1 1 NA 1
2 2 1 4 1
3 2 2 4 3
4 3 1 NA 3
5 4 NA 2 4
6 NA 4 NA NA
7 NA 3 4 4
8 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
purrr::keep(.p = is.numeric) %>% # 숫자형 데이터만 남기기
purrr::map_df(.x = .,
.f = My5isNA)
Results |
# A tibble: 8 x 5
workshop q1 q2 q3 q4
<int> <int> <int> <int> <int>
1 1 1 1 NA 1
2 2 2 1 4 1
3 1 2 2 4 3
4 2 3 1 NA 3
5 1 4 NA 2 4
6 2 NA 4 NA NA
7 1 NA 3 4 4
8 2 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
purrr::map_if(is.numeric, My5isNA) %>%
as_tibble()
Results |
# A tibble: 8 x 6
workshop gender q1 q2 q3 q4
<int> <chr> <int> <int> <int> <int>
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_if(is.numeric, funs(My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- 변수명 지정 없이 연속적인 변수를 적용.
- 변수명 대신에 열 번호를 사용.
- q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
R Programming |
%%R
withmooc %>%
map(~ transmute(mydata[3:6], {{.x}} := My5isNA(.))) %>%
as_tibble()
Results |
# A tibble: 8 x 6
workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
<int> <chr> <int> <int> <int> <int>
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
select(3:6) %>%
purrr::map_df(My5isNA)
Results |
# A tibble: 8 x 4
q1 q2 q3 q4
<int> <int> <int> <int>
1 1 1 NA 1
2 2 1 4 1
3 2 2 4 3
4 3 1 NA 3
5 4 NA 2 4
6 NA 4 NA NA
7 NA 3 4 4
8 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_at(3:6, funs(My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
- 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
- Which함수는 각 변수명의 열 번호를 발견.
R Programming |
%%R
withmooc = mydata
A <- which( names(mydata)=="q1" )
Z <- which( names(mydata)=="q4" )
withmooc %>%
map(~ transmute(mydata[A:Z], {{.x}} := My5isNA(.))) %>%
as_tibble()
Results |
# A tibble: 8 x 6
workshop$..1 gender$..1 q1$..1 q2$..1 q3$..1 q4$..1
<int> <chr> <int> <int> <int> <int>
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_at(A:Z, funs(My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 NA 1
2 2 f 2 1 4 1
3 1 f 2 2 4 3
4 2 f 3 1 NA 3
5 1 m 4 NA 2 4
6 2 m NA 4 NA NA
7 1 m NA 3 4 4
8 2 m 4 NA NA NA
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_at(A:Z, funs(var = My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4 q1_var q2_var q3_var q4_var
1 1 f 1 1 5 1 1 1 NA 1
2 2 f 2 1 4 1 2 1 4 1
3 1 f 2 2 4 3 2 2 4 3
4 2 f 3 1 NA 3 3 1 NA 3
5 1 m 4 5 2 4 4 NA 2 4
6 2 m 5 4 5 5 NA 4 NA NA
7 1 m 5 3 4 4 NA 3 4 4
8 2 m 4 5 5 5 4 NA NA NA
- 관측값 대체
- 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
- q3의 관측치 처리
R Programming |
%%R
withmooc = mydata
withmooc %>%
dplyr::mutate(q3 = ifelse( is.na(q3) ,
mean(q3,na.rm=TRUE),
q3 )
)
Results |
workshop gender q1 q2 q3 q4
1 1 f 1 1 5.000000 1
2 2 f 2 1 4.000000 1
3 1 f 2 2 4.000000 3
4 2 f 3 1 4.142857 3
5 1 m 4 5 2.000000 4
6 2 m 5 4 5.000000 5
7 1 m 5 3 4.000000 4
8 2 m 4 5 5.000000 5
- [참고] 접미어(_var)를 추가하여서 새로운 변수 생성
R Programming |
%%R
withmooc = mydata
withmooc %>%
mutate_at(A:Z, funs(var = My5isNA(.)))
Results |
workshop gender q1 q2 q3 q4 q1_var q2_var q3_var q4_var
1 1 f 1 1 5 1 1 1 NA 1
2 2 f 2 1 4 1 2 1 4 1
3 1 f 2 2 4 3 2 2 4 3
4 2 f 3 1 NA 3 3 1 NA 3
5 1 m 4 5 2 4 4 NA 2 4
6 2 m 5 4 5 5 NA 4 NA NA
7 1 m 5 3 4 4 NA 3 4 4
8 2 m 4 5 5 5 4 NA 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
- 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
Python Programming |
withmooc.iloc[:,3] = withmooc['q1'].replace(5, np.nan)
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- 변수 q1이 5인 값에 대하여, 변수명이 q1인 변수의 값을 결측치로 변경.
Python Programming |
withmooc.loc[:,'q1'] = np.where(withmooc['q1'] == 5, np.nan, withmooc['q1'])
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- np.where 함수를 사용하여서 q1의 값이 5인 관측치를 결측치로 변경.
Python Programming |
withmooc.loc[:,'q1'] = np.where(withmooc['q1'] == 5, np.nan, withmooc['q1'])
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- apply() 함수와 IF()
Python Programming |
withmooc= mydata.copy()
withmooc['q1'] = withmooc['q1'].apply(lambda x: np.NaN if (x==5) else x)
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- map() 함수와 IF()
Python Programming |
withmooc= mydata.copy()
withmooc['q1'] = withmooc['q1'].map(lambda x: np.NaN if (x==5) else x)
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- apply() 함수, 사용자 함수 - IF()
Python Programming |
withmooc= mydata.copy()
def replace_5(x):
if x == 5:
return np.NaN
else:
return x
withmooc['q1'] = withmooc['q1'].apply(lambda x:replace_5(x))
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- [참고] Map
Python Programming |
withmooc= mydata.copy()
mapper = {True:'True',False:'False'}
(withmooc['q1']==5).map(mapper)
Results |
0 False
1 False
2 False
3 False
4 False
5 True
6 True
7 False
Name: q1, dtype: object
- mydata에서 모든 변수에 대하여 모든 값 5를 관측치로 변경.
Python Programming |
withmooc.replace(5, np.nan)
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
- np.NaN
Python Programming |
withmooc[mydata==5] = np.NaN
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
한번에 다수의 변수를 함께 변경하는 예제.
- 5의 값을 관측치로 변경하는 함수 생성.
Python Programming |
withmooc= mydata.copy()
def replace_5(x):
if x == 5:
return np.NaN
else:
return x
withmooc['q1'] = withmooc['q1'].apply(lambda x:replace_5(x))
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
- 변수 리스트에 대하여 결측치 값을 할당.
- Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
Python Programming |
withmooc= mydata.copy()
def replace_5(x):
if x == 5:
return np.NaN
else:
return x
withmooc[['q1','q2','q3','q4']] = withmooc[['q1','q2','q3','q4']].applymap(lambda x:replace_5(x))
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
- 변수명 지정 없이 연속적인 변수를 적용.
- 변수명 대신에 열 번호를 사용.
- q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
Python Programming |
withmooc= mydata.copy()
def replace_5(x):
if x == 5:
return np.NaN
else:
return x
withmooc.iloc[:,3:7] = withmooc.iloc[:,3:7].applymap(lambda x:replace_5(x))
withmooc
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
- 열 번호에 의한 것보다 변수명에 의해 많은 연속적인 변수를 다루는 방법.
- Which함수는 각 변수명의 열 번호를 발견.
Python Programming |
withmooc= mydata.copy()
mylist = list(withmooc.columns)
myA = mylist.index("q1")
print(myA)
myZ = mylist.index("q4")
print(myZ)
withmooc.iloc[:,myA:myZ + 1] = withmooc.iloc[:,myA:myZ + 1].applymap(lambda x:replace_5(x))
withmooc
Results |
3
6
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
- 관측값 대체
- 변수 q3에서 관측치를 제외한 관측값의 평균을 q3의 관측값 중 결측치를 대체한다.
Python Programming |
withmooc= mydata.copy()
withmooc.where(pd.notnull(withmooc), withmooc.mean(), axis='columns')
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.000000 1
1 2 2 f 2 1 4.000000 1
2 3 1 f 2 2 4.000000 3
3 4 2 f 3 1 4.142857 3
4 5 1 m 4 5 2.000000 4
5 6 2 m 5 4 5.000000 5
6 7 1 m 5 3 4.000000 4
7 8 2 m 4 5 5.000000 5
Python Programming |
withmooc= mydata.copy()
withmooc.fillna(withmooc.mean()['q3'])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1 1 5.000000 1
1 2 2 f 2 1 4.000000 1
2 3 1 f 2 2 4.000000 3
3 4 2 f 3 1 4.142857 3
4 5 1 m 4 5 2.000000 4
5 6 2 m 5 4 5.000000 5
6 7 1 m 5 3 4.000000 4
7 8 2 m 4 5 5.000000 5
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
- 변수 q1이 5인 값에 대하여 세번째 변수(q1)의 값을 결측치로 변경.
한 번에 |
withmooc >> mutate(q1=make_symbolic(np.where)( (X.q1 == 5) ,np.nan,X.q1))
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1 5.0 1
1 2 2 f 2.0 1 4.0 1
2 3 1 f 2.0 2 4.0 3
3 4 2 f 3.0 1 NaN 3
4 5 1 m 4.0 5 2.0 4
5 6 2 m NaN 4 5.0 5
6 7 1 m NaN 3 4.0 4
7 8 2 m 4.0 5 5.0 5
많은 변수를 변경하는 예제.
- 5의 값을 관측치로 변경하는 함수 생성.
Python Programming |
@make_symbolic
def My5isNA(x):
return np.where(x == 5,np.NaN,x)
withmooc >> mutate(q1 = My5isNA(X.q1))
withmooc >> mutate(mf=[My5isNA(x) for x in withmooc.q1])
Results |
id workshop gender q1 q2 q3 q4 mf
0 1 1 f 1 1 5.0 1 1.0
1 2 2 f 2 1 4.0 1 2.0
2 3 1 f 2 2 4.0 3 2.0
3 4 2 f 3 1 NaN 3 3.0
4 5 1 m 4 5 2.0 4 4.0
5 6 2 m 5 4 5.0 5 nan
6 7 1 m 5 3 4.0 4 nan
7 8 2 m 4 5 5.0 5 4.0
- 변수 리스트에 대하여 결측치 값을 할당.
- Lapply 함수는 리스트의 모든 값에 대하여 함수를 적용한다.(Data Frame은 리스트의 형태.)
Python Programming |
# 수치형 변수에 대한 자동 포맷팅
@make_symbolic
def My5isNA(x):
return np.where(x == 5,np.NaN,x)
withmooc >> mutate(**{
**{f"{x}": X[x].apply(My5isNA) for x in withmooc.select_dtypes([int,float]).columns}
})
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
- [참고]
Python Programming |
withmooc >> filter_by(~X[['workshop', 'gender']].duplicated())
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
4 5 1 m 4 5 2.0 4
5 6 2 m 5 4 5.0 5
- [참고] 수치형 변수 선택
Python Programming |
print( withmooc.select_dtypes(include=np.number).columns.tolist() )
print( [ col for col in withmooc.columns if withmooc[col].dtypes != "object"] )
Results |
['q1', 'q2', 'q3', 'q4']
['q1', 'q2', 'q3', 'q4']
Python Programming |
@make_symbolic
def My5isNA(x):
return np.where(x == 5,np.NaN,x)
# https://blog.amedama.jp/entry/dfply#Intention
@pipe
@symbolic_evaluation()
def symbolic_double(df, serieses):
for series in serieses:
df[series.name] = My5isNA(series)
return df
withmooc >> symbolic_double([X.q1, X.q2, X.q3, X.q4])
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN NaN NaN
Python Programming |
@pipe
@symbolic_evaluation()
def symbolic_double(df, *serieses):
for series in serieses:
df[series.name] = series * 2
return df
diamonds >> symbolic_double(X.carat, X.price) >> head()
Results |
carat cut color clarity depth table price x y z
0 0.46 Ideal E SI2 61.5 55.0 652 3.95 3.98 2.43
1 0.42 Premium E SI1 59.8 61.0 652 3.89 3.84 2.31
2 0.46 Good E VS1 56.9 65.0 654 4.05 4.07 2.31
3 0.58 Premium I VS2 62.4 58.0 668 4.20 4.23 2.63
4 0.62 Good J SI2 63.3 58.0 670 4.34 4.35 2.75
Python Programming |
@pipe
@symbolic_evaluation()
def symbolic_multiply(df, n, serieses):
for series in serieses:
df[series.name] = series * n
return df
diamonds >> symbolic_multiply(3, [X.carat, X.price]) >> head()
Results |
carat cut color clarity depth table price x y z
0 0.69 Ideal E SI2 61.5 55.0 978 3.95 3.98 2.43
1 0.63 Premium E SI1 59.8 61.0 978 3.89 3.84 2.31
2 0.69 Good E VS1 56.9 65.0 981 4.05 4.07 2.31
3 0.87 Premium I VS2 62.4 58.0 1002 4.20 4.23 2.63
4 0.93 Good J SI2 63.3 58.0 1005 4.34 4.35 2.75
- [참고] 통계량 계산
Python Programming |
withmooc >> summarize(**{
**{f"{x}_mean": X[x].mean() for x in mydata.select_dtypes(int).columns},
**{f"{x}_std" : X[x].std() for x in mydata.select_dtypes(int).columns}
})
Results |
q1_mean q2_mean q4_mean q1_std q2_std q4_std
0 3.25 2.75 3.25 1.488048 1.752549 1.581139
- [참고] int -> float 으로 데이터 형식 변경
Python Programming |
@dfpipe
def ints_to_floats(df):
return df.assign(**{x[0]: x[1] for x in df.select_dtypes(int).astype(float).items()})
withmooc >> ints_to_floats()
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 5.0 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 5.0 2.0 4.0
5 6 2 m 5.0 4.0 5.0 5.0
6 7 1 m 5.0 3.0 4.0 4.0
7 8 2 m 4.0 5.0 5.0 5.0
- [참고 : 일괄 통계량 산출]
Python Programming |
withmooc >> summarize(**{
**{f"{x}_mean": X[x].mean() for x in withmooc.select_dtypes(int).columns},
**{f"{x}_std" : X[x].std() for x in withmooc.select_dtypes(int).columns}
})
Results |
q1_mean q2_mean q4_mean q1_std q2_std q4_std
0 3.25 2.75 3.25 1.488048 1.752549 1.581139
- [참고]
Python Programming |
@dfpipe
def ints_to_floats(df):
return df.assign(**{x[0]: x[1] + 100 for x in withmooc.select_dtypes(int).items()})
withmooc >> ints_to_floats()
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 101 101 5.0 101
1 2 2 f 102 101 4.0 101
2 3 1 f 102 102 4.0 103
3 4 2 f 103 101 NaN 103
4 5 1 m 104 105 2.0 104
5 6 2 m 105 104 5.0 105
6 7 1 m 105 103 4.0 104
7 8 2 m 104 105 5.0 105
- 변수명 지정 없이 연속적인 변수를 적용.
- 변수명 대신에 열 번호를 사용.
- q1은 3번째 변수이고, q4는 6번째 변수 이므로, 3:6을 사용.
Python Programming |
@make_symbolic
def My5isNA(x):
return np.where(x == 5,np.NaN,x)
## 일단 우격 다짐.
withmooc >> mutate_if(lambda col : True, lambda row : My5isNA(row))
Results |
id workshop gender q1 q2 q3 q4
0 1 1 f 1.0 1.0 NaN 1.0
1 2 2 f 2.0 1.0 4.0 1.0
2 3 1 f 2.0 2.0 4.0 3.0
3 4 2 f 3.0 1.0 NaN 3.0
4 5 1 m 4.0 NaN 2.0 4.0
5 6 2 m NaN 4.0 NaN NaN
6 7 1 m NaN 3.0 4.0 4.0
7 8 2 m 4.0 NaN 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 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 |
반응형
'통계프로그램 비교 시리즈 > 데이터 전처리 비교' 카테고리의 다른 글
통계프로그램 비교 시리즈 – [데이터 관리] 5. 변수명 변경(Rename) (0) | 2022.01.10 |
---|---|
통계프로그램 비교 시리즈 – [데이터 관리] 4. 다중 조건에 의한 변환 (0) | 2022.01.10 |
통계프로그램 비교 시리즈 – [데이터 관리] 2. 조건문에 의한 변환 (0) | 2022.01.07 |
통계프로그램 비교 시리즈 – [데이터 관리] 1. 변수 변환 (0) | 2022.01.07 |
통계프로그램 비교 시리즈 – [변수와 관측치 선택] 3. 변수와 관측치를 동시에 선택 (0) | 2022.01.07 |
댓글