Pandas - 전처리

[참조] 패스트캠퍼스 - 직장인을 위한 파이썬 데이터분석 올인원 패키지 Online.

결측값 채우기

데이터 분석을 하다보면 누락된 데이터가 발생할 수 있다. 누락된 데이터를 채워줄 필요가 있을 수 있고 이 때 사용하는 함수가 fillna 함수이다.

df['키'].fill(-1)

NaN으로 누락되어 있는 값을 -1로 채워넣지만 값이 유지가 되지는 않는다.

df['키'].fillna(-1, inplace=True)

inplace=True 옵션을 주면 값이 유지가 된다. 또는 채워넣은 값을 다시 대입하는 방식도 있다.

df['키'] = df['키'].fillna(-1)

누락된 값에 -1이 아닌 평균값을 넣어줄 수도 있다.

height = df['키'].mean()
df['키'].fillna(height, inplace=True)

결측값 제거

누락된 데이터를 위 방식처럼 채워줄 수도 있지만 행을 제거해버릴 수도 있다.

df.dropna()

DataFrame에서 결측값을 포함한 모든 행을 제거해버린다.

  • 행 제거
    df.dropna(axis=0)
    

    axis=0 옵션은 행을 드랍하는 옵션으로 기본 dropna() 결과와 동일하다.

  • 열 제거
    df.dropna(axis=1)
    

    axis=1 옵션을 주게되면 행이 아닌 열을 드랍하한 결과를 반환해준다.

how 옵션

df.dropna(how='any')

any 옵션은 하나라도 결측값이 있다면 드랍하는 옵션이다.

df.dropna(how='all')

all 옵션은 해당 행/열에 모든 값이 결측값일 경우 드랍하는 옵션이다.

중복값 제거

중복된 값을 제거해주는 함수도 존재한다.

df['키'].drop_duplicates()

drop_duplicates() 함수는 기본적으로 첫 번째 값은 유지하지만 뒤에 나온 중복된 값들을 제거해준다. NaN 값도 여러개가 있다면 중복으로 간주한다.

df['키'].drop_duplicates(keep='last')

기본적으로 첫 번째 값을 유지하기 때문에 마지막 값을 유지하기 위해서는 keep=’last’ 옵션을 준다.

df.drop_duplicates('그룹')

일반적으로 drop_duplicates() 함수는 중복된 값을 없애 NaN 값으로 만들어준다. 중복된 값이 있는 행을 드랍하기 위해서는 인자로 열 이름을 주면된다.

Drop - column/row

열 제거

df.drop('그룹', axis=1)

‘그룹’열을 제거한다.

복수 열 제거

df.drop(['그룹', '소속사'], axis=1)

복수개의 열을 제거 할떄는 list로 지정해준다.

행 제거

df.drop(3, axis=0)

3번 행을 제거한다.

복수 행 제거

df.drop([3, 5], axis=0)

복수개의 행을 제거 할때도 동일하게 list로 지정해준다.

DataFrame 합치기

행 기준 합치기

df_concat = pd.concat([df. df2], sort=False)

합칠 2개의 DataFrame을 list 형태로 지정해주고 sort=False 옵션을 주어 순서가 유지되도록 해준다. 하지만 합치게 되면 index가 꼬일 수가 있다.

df_concat.reset_index()

index를 초기화 해주게 되면 중복된 index 번호를 제거해주고 0번부터 차례대로 index 번호를 할당해 주게 된다. 하지만 ‘index’ 열을 새로 생성해서 기존 index 값을 유지해준다.

df_concat.reset_index(drop=True)

굳이 index 값을 표기해줄 이유가 없다면 drop=True 옵션을 주어 원래의 index 값을 제거해준다.

열 기준 합치기

pd.concat([df, df2], axis=1)

만약 열 기준으로 합칠때 행의 갯수가 맞지 않는다면 NaN 값을 넣어 합치게 된다.

DataFrame 병합(merge)

concat과 merge는 단순 합치는 것인지, 특정 기준에 따라 합치는 것인지에 따라 용도가 달라진다.

  • concat: row나 column 기준으로 단순 합치기
  • merge: 특정 고유 키 값을 기준으로 병합
pd.merge(left, right, on='기준column', how='left')
  • left, right: 병합할 DataFrame
  • on: 병합의 기준이 되는 column
  • how: ‘left’, ‘right’, ‘inner’, ‘outer’ 병합 방식 중 한가지
pd.concat([df, df2], axis=1)

만약 이처럼 df와 df2 DataFrame을 열 기준으로 concat 합치기를 실행한다면 아래와 같은 경우가 발생할 수 있다.

그림1

index를 기준으로 합치기 때문에 원치않는 위치에 데이터가 들어갈 수가 있다.

left

pd.merge(df, df2, on='이름', how='left')
  • df와 df2를 ‘이름’에 맞추어 병합
  • left: 왼쪽에 있는 df DataFrame을 기준으로 병합
  • 왼쪽 DataFrame의 데이터는 유지하고 오른쪽 DataFrame에 해당 키가 없으면 NaN으로 채워넣음
pd.merge(df, df2, on='이름', how='right')
  • left와 동일하며 기준만 오른쪽 DataFrame으로 바뀜

inner

pd.merge(df, df2, on='이름', how='inner')
  • 두 DataFrame에 모두 키 값이 존재하는 경우에만 병합
  • 교집합

outer

pd.merge(df, df2, on='이름', how='outer')
  • 하나의 DataFrame이라도 키 값이 존재하면 병합
  • 합집합

이름과 성함 같이 column 명은 다르지만 동일한 성질의 데이터를 가지고 있는 경우가 있을 수 있다. 하지만 on 옵션을 줄 때 coulmn 명은 같아야지만 merge가 가능하다.

pd.merge(df, df_right, left_on='이름', right_on='성함', how='outer')

왼쪽 DataFrame의 on 기준과 오른쪽 DataFrame의 on 기준을 설정하여 merge를 할 수 있다.

[참조] 패스트캠퍼스 - 직장인을 위한 파이썬 데이터분석 올인원 패키지 Online.

끝!