12. pandas DataFrame 조작하기(datatime데이터형 / 결측값,이상치(NaN)/열 조작/ 행 조작)
2018. 2. 24. 19:28
- dataFrame은 인덱스와 컬럼인자를 주지 않으면, index와 columns는 0부터 시작한다.
여기서는 numpy의 랜덤함수인 np.random.rand( 행,렬)로 랜덤 array를 만들어서 대입해보자.
이 때, index에 대해서는 pd.date_range( “ yyyymmdd”, periods = 6) 함수를 사용해보자.
pandas에서 제공하는 Datetime64라는 데이터형으로 구성된 인덱스( DatatimeIndex)를 생성할 때 사용되는 함수다.
뒤에 periods =6 은 입력날 날자로부터 6일에 대한 index를 생성한다. 즉, 6개 행을 만든다.
결측값, 이상치(NaN) 조작하기
pandas를 이용해서 dataset를 가져올 때, NaN과 같이 범주에서 벋어난 값이 존재 할 수 있다. 이러한 값을 결측값(missing value), 이상치(out lier)라고 한다. 이 결측값, 이상치를 제거하거나 새로운 값으로 대입하는 방법을 알아보자.
- 먼저, 새로운 열F를 만들고, 값을 입력하는 과정에서 하나의 성분으로 np.nan을 이용해보자. 성분에 NaN을 대입하는 numpy의 함수다
- 이제 우리는 NaN이라 표기된 값만 골라내고,해당 행을 제거해야한다.
(행제거는 밑에어 df.drop()으로 따로 배운다. 여기서는 NaN을 포함하는 행을 제거하는 방법을 배운다.)
이럴 때, df.dropna( how = “any” ) 함수를 이용해야한다. 각 행들 중 NaN을 포함하는 행들을 제거한 df를 가져올 수 있다.
이 때, any는 행의 성분에 NaN이 하나라도 있으면 그 행을 제거 라는 뜻이다.
만약, how의 인자에 “all”이 있다면, 행의 성분이 모두 NaN일 때 제거한다는 뜻이다. 지금은 모두 NaN인 행이 없으니 그대로나올 것이다 - 이제 NaN이 포함된 행을 제거하는 것이 아니라, NaN에 다른 값을 대입해보자.
이럴 땐, df.dropna(how=" ")가 아닌 df.fillna(value=5.0)함수를 사용해야한다.
NaN 성분들에 일괄적으로 value값을 대입한다. - NaN이 포함되어 있는 데이터에 대한 boolean마스크를 생성할 수 있다. NaN인 성분만 True를 뽑아내주는 df.isnull()함수를 사용해준다.
*****이제 이러한 마스크를 이용해서 loc함수의 행index자리에 넣어 NaN을 포함한 행만 뽑아낼 수 있다.*****
기존에 강의에서는 np.array로 생성한 array에 대해
[ 전체기준열-> 열안의 특성성분과 조건문을 통해 마스크생성 (for문을 이용할 경우, 중복없는기준열생성) -> 행index자리에 넣기 ]
에 넣기 의 과정으로 뽑아냈다면,
- 여기 NaN를 뽑아내기위해서, 전체기준열을 뽑기전에 df.isnull()함수를 먼저 사용해야하므로 전체 데이터에 대한 마스크를 먼저 생성한다
[ is.null()로 전체마스크 –> 전체 마스크 중 df[ “ 전체기준열” ]으로 직접제시 –> loc함수의 행index자리에 넣기 ]
df.loc[ df.isnull()["F"] , :]
행 또는 열의 삭제
index를 이용해서 행을 삭제하는 방법도 있다.
- 행을 삭제하기에 앞서, 행의 index에 접근을 먼저해야한다. 왜냐면, 앞에서 행의 index에다가 datetime데이터형을 집어넣었고, 그것에 접근하려면 datetime타입으로 접근해야하기 때문이다.
pd.to_datetime("20160701")함수를 이용해서, (index로 줬던 것으로) 날자명을—> datatime데이터형으로 변환할 수 있다.
이전에 index명에 pd.date_range()함수를 통하여 datetime데이터형으로 집어넣었기 때문에,
이에 index에 접근할려면 마찬가지로 datetime데이터형을 인자로 넣어야한다. 그래서 한번의 변환과정을 거치면서 작업을 해줘야하는 것이다.
pd.date_range( “날자”, periods = 행수) 생성 – > index –> pd.to_datetime(“날자”) 접근
“20160701” > 2016-07-01 > “20160701” to 2016-07-01 - “yyyymmdd”날자명을 pd.to_datetime()로 index로 변환한 것을 df.drop()함수의 인자로 넣어서 해당행을 삭제한다.
( 열을 삭제할 때는 del df[“칼럼명(열명)”] 이었다. 행 삭제는 df.drop( 해당인덱스)이다. )
df.drop( pd.to_datetime("20160701") ) 를 입력하면 2016-07-01 인덱스를 가진 행이 사라진 것을 확인할 수 있다. - 마찬가지로 2개이상의 특정행을 삭제하고 싶다면, df.drop()의 인자로 [리스트]형태로 넣어서 삭제해주면 된다.
df.drop( [ pd.to_datetime("20160702"), pd.to_datetime("20160704")] ) - df.drop()함수로, 열을 삭제할 수 도 있다. drop()함수의 인자는 기본적으로 행의 인덱스를 가져야 하는데, 이를 상쇄하면서
들어간 인자가 “컬럼명”이라는 것을 명시해주기 위해 새로운 인자 axis=1이 들어간다.
df.drop("F", axis=1)
8강 numpy 함수중 arr.sum()의 인자로 쓰였다. sum() = arr 성분전체 합/axis=0은 각각 열들의 합/ axis=1은 각각 행들의 합,[열->방향]
8강 정렬함수 np.sort()의 인자로는 쓰였따. sort( arr, axis=0 ) 각 열을 오름차순으로 정리 / axis=1은 각 행을 오름차순으로 정렬[열->방향]
12강 DataFrame의 행삭제 df.drop()의 인자로 쓰여, axis=1은 행 대신 열을 삭제하도록 해준다.[열->방향에서 해당 열삭제]
- df.drop()함수를 이용해서 2개이상의 열을 삭제할 때도, 열명은 리스트의 형태로 작성한 뒤 콤마, axis=1를 넣어주면 된다.
df.drop( [ "B","F"], axis=1)
'빅데이터 관련 프로그래밍 > Python - bigdata(pandas 기초)' 카테고리의 다른 글
14. pandas 데이터분석 해보기(파일읽기, 분석 3가지(고난도), 파일쓰기) (4) | 2018.02.25 |
---|---|
13.Pandas DataFrame 데이터분석용 함수(통계함수, 정렬함수, 유용한 함수, 사용자정의함수 적용) (2) | 2018.02.24 |
11. pandas DataFrame 인덱싱(열 / 행 / boolean 인덱싱) (7) | 2018.02.24 |
10. pandas의 자료구조 Series와 DataFrame 살펴보기 (0) | 2018.02.23 |
9. Numpy 데이터분석 해보기(파일읽기, 분석하기(고난도), 파일쓰기) (0) | 2018.02.23 |