[Machine Learning with Python Cookbook] ch3. Data Wrangling

3월 30, 2021





Summary

 Data wrangling은 원본 데이터를 정제하고 사용 가능한 형태로 구성하기 위한 변환 과정을 광범위하게 의미하는 비공식적인 용어입니다. 사용하는 가장 일반적인 구조는 데이터프레임입니다.

    * 데이터프레임 만들기 (3.1)
        - pandas에 데이터프레임 객체 만들 수 있는 다양한 방법 존재
        - DataFrame 클래스 사용: pd.DataFrame()
        - 원본 리스트 전달: pd.DataFrame(data, columns=['a', 'b'])
        - numpy 배열 주입: pd.DataFrame(np.array(data), columns=['a', 'b'])
        - dictionary 전달: pd.DataFrame(dictionary)

    데이터 설명하기 (3.2)
        - 차원 확인: dataframe.shape
        - 열 개수 확인: dataframe.count() (3.7)
        - 수치형 열 통계값 확인: dataframe.describe()
        - 수치형 열 상관계수 확인: dataframe.corr() (3.7)
        - 수치형 열 공분산 확인: dataframe.cov() (3.7)

    데이터프레임 탐색하기 (3.3)
        - loc: 데이터프레임 인덱스가 label(문자열 등)일 때 사용.
         dataframe.loc['hubert']
        - iloc: 데이터프레임의 위치 참조.
         dataframe.iloc[0]
        - loc, iloc 메서드의 슬라이싱은 python 슬라이싱과 달리 마지막 인덱스를 포함

    데이터프레임 수정
        - 값 치환: replace 메서드. (3.5)
         dataframe['column'].replace('hubert', 'ashley') 
        - 열 이름 변경: rename 메서드. (3.6)
         dataframe.rename(columns={'Name': 'Nickname'}) 
        - 열 삭제 I: drop 메서드와 열 이름. (3.10)
         dataframe.drop('Name', axis=1) 
        - 열 삭제 II: drop 메서드와 열 인덱스. (3.10)
         dataframe.drop(dataframe.columns[0], axis=1) 
        - 행 삭제 I: 불리언 조건. (3.11)
         dataframe[dataframe['Name'] != False] 
        - 행 삭제 II: 행 인덱스. (3.11)
         dataframe[dataframe.index != 0] 
        - 중복행 삭제: drop_duplicates 메서드 사용 (3.12)

    데이터프레임 고유한 값 처리 (3.8)
        - 열 내부 고유한 값 찾기: unique 메서드.
         dataframe['Name'].unique()
        - 열 내부 고유한 값 count: value_counts 메서드. 
         dataframe['Name'].value_counts()
        - 데이터프레임 전체 고유한 값 count: nunique 메서드.
         dataframe.nunique()

    데이터프레임 누락된 값 (3.9)
        - 누락 값 여부 확인: isnull/notnull 메서드.
         dataframe['Name'].isnull()

    데이터프레임 그룹핑
        - 값에 따라 행 그룹핑: groupby 메서드.
         datafeamr.groupby(['Name'])['Age'].mean() (3.13)
        - 시간에 따라 행 그룹핑: resample 메서드. index를 time range(datetime format)로 변경한 뒤 적용.
         dataframe.resample('W').sum() (3.14)
        - 그룹에 함수 적용하기: groupby로 행을 그룹핑하고 각 그룹에 apply 메서드 연결.
          dataframe.groupby('Name').apply(lambda x: x.count()) (3.17)

    데이터프레임 모든 열 원소에 함수 적용하기 (3.16)
        - apply 메서드: 열의 모든 원소에 내장 함수나 사용자 정의 함수 적용. 매개변수를 지정할 수 있음.
         dataframe['Name'].apply(uppercase)
         dataframe['Name'].apply(labbda x, age: x < age, age=40)
        - map 메서드: apply와 비슷하지만 dictionary를 input으로 넣을 수 있음.
         dataframe['Name'].map({True: 1, False: 0})

    데이터프레임 연결하기 (3.18)
        - 행 방향으로 연결하기: concat 함수에 axis=0 매개변수 사용.
         pd.concat([dataframe_a, dataframe_b], axis=0)
        - 열 방향으로 연결하기: concat 함수에 axis=1 매개변수 사용.
         pd.concat([dataframe_a, dataframe_b], axis=1)

    데이터프레임 병합하기 (3.19)
        - inner join: merge 메서드 사용하며 on 매개변수에 병합 열 지정.
         pd.merge(dataframe_a, dataframe_b, on='Name')
        - outer/left/right join: merge 메서드 사용하며 how 매개변수에 outer/left/right 사용.
         pd.merge((dataframe_a, dataframe_b, on='Name', how='outer')
        - left_on & right_on: 각 데이터프레임에서 병합하기 위한 열 이름 지정.
         pd.merge(dataframe_a, dataframe_b, left_on='Name', right_on='Age')
        - left_index & right_index: 열 기준 대신 인덱스를 기준으로 병합.
         pd.merge(datafeamr_a, dataframe_b, left_index=True, right_index=True)

    * Summary in Summary
        - merge 연산을 위해 세 가지 사항을 지정
            1. 병합할 두 개의 데이터프레임 지정
            2. 병합하기 위한 열 이름 지정
            3. 'how' 매개변수로 병합연산 종류 지정
                1) inner: 두 데이터프레임에 모두 존재하는 행만 반환
                2) outer: 두 데이터프레임의 모든 행 반환
                3) left: 왼쪽 데이터프레임의 모든 행 반환
                4) right: 오른쪽 데이터프레임의 모든 행 반환


Code