Post

Pandas 데이터 전처리 - 컬럼추가, 삭제, 타입변환, datetime, cut/qcut

Pandas 데이터 전처리 - 컬럼추가, 삭제, 타입변환, datetime, cut/qcut

Pandas 데이터 전처리 - 컬럼추가, 삭제, 타입변환, datetime, cut/qcut

데이터 분석

컬럼추가

df['VIP'] = True

행/컬럼삭제

  • 행삭제
    • 인덱스 지정 : df.drop(1)
    • 범위 지정 : df.drop(np.arrange(10))
    • 인덱싱 : df1.drop([1,3,5,7,9])
  • 열삭제
    • 단일 삭제 : df.drop('class',axis = 1)
    • 다수 삭제 : df.drop(['who', 'deck', 'alive'], axis=1)
    • 삭제 내용 바로 df 적용 : df1.drop(['who', 'deck', 'alive'], axis=1, inplace=True)

컬럼간 연산

  • 연산을 통해 새로운 컬럼 추가(1) : df['family'] = df['sibsp'] + df['parch']
  • 연산을 통해 새로운 컬럼 추가(2) : df['round'] = round(df['fare'] / df['age'], 2)
  • 문자열의 합(이어붙이기)으로 새로운 컬럼 추가 : df['gender'] = df1['who'] + '-' + df['sex']

타입변환

  • 타입확인 : df['pclass'].dtype
  • 타입변환
    • int32 : df['pclass'].astype('int32')
    • float : df['pclass'].astype('float32')
    • object : df['pclass'].astype('str')
    • category : df['who'].astype('category')
  • Category 타입 관련
    .cat으로 접근하여 category 타입이 제공하는 attribute를 사용
    • 값 확인 : df['who'].cat.codes
    • 이름 변경
      • {‘기존카테고리이름’ : ‘변경할카테고리이름’} dict 생성
        cat_dict = {f'{g}': f'Group({g})' for g in df1['who'].cat.categories}
      • rename_categories 메소드 호출인자로 넣어서 실행
        df1['who'] = df1['who'].cat.rename_categories(cat_dict)

        datetime - 날짜, 시간

        date_range

  • 주요 옵션 값
    • start: 시작 날짜
    • end: 끝 날짜
    • periods: 생성할 데이터 개수
    • freq: 주기

dates = pd.date_range('20210101',periods = df.shape[0], freq = '15H')
df['dates'] = dates

datetime 타입

  • dt 접근자로 날짜 속성에 접근 가능
    • df['date'].dt.year: 연도
    • df['date'].dt.month: 월
    • df['date'].dt.day: 일
    • df['date'].dt.hour: 시
    • df['date'].dt.minute: 분
    • df['date'].dt.second: 초
    • df['date'].dt.week: 주
    • df['date'].dt.weekday: 요일 (월:0, 일:6)
    • df['date'].dt.quarter: 분기

to_datetime

  • datetime 타입으로 변경해서 .df 접근자 사용 가능
  • pd.to_datetime() : datetime type으로 변환
  • df2['대여일자'] = pd.to_datetime(df['대여일자'])
    |Before|After|
    |—|—| Jan-20-2020 | 2020-01-20 May-20-2020 | 2020-05-20

pd.to_numeric() - 수치형 변환

pd.to_numeric(df2['운동량']) -> error 발생 이유: NaN값 때문에
숫자형으로 변환할 때 NaN값이나 숫자로 변환이 불가능한 문자열이 존재할 때 변환 실패를 함. 그래서 errors= 옵션 값을 바꾸어 해결

1
errors : {'ignore', 'raise', 'coerce'}, default 'raise' 
  • errors=’coerce’: 잘못된 문자열은 NaN값으로 치환하여 반환
    pd.to_numeric(df2['운동량'], errors='coerce')
  • errors=’ignore’ : 잘못된 문자열이 숫자로 변환이 안되고 무시하기 때문에 전체 컬럼의 dtype은 object로 그대로 남아있음
    pd.to_numeric(df2['운동량'], errors='ignore')

pd.cut() - 구간나누기(binning)

  • 연속된 수치를 구간으로 나누어 카테고리화 할 때 사용
  • 예시
  • 직접 범위 설정
    1
    2
    
    bins = [0, 200, 400, df2['운동량'].max()]
    pd.cut(df2['운동량'], bins, right=False) # [ : 이상, ) : 미만
    
  • labels를 지정(지정한 bins의 수보다 1개 적어야함)
    1
    2
    
    labels = ['운동부족', '보통', '많음']
    pd.cut(df2['운동량'], bins, labels=labels, right=False)
    
  • 10개의 그룹으로 나누기
    1
    2
    
    df2['운동량_cut'] = pd.cut(df2['운동량'], bins=10)
    df2['운동량_cut'].value_counts()
    
  • 직접 범위 설정
    bins = [0, 200, 400, df2['운동량'].max()]
    pd.cut(df2['운동량'], bins, right=False) # [ : 이상, ) : 미만
  • labels를 지정(지정한 bins의 수보다 1개 적어야함)
    labels = ['운동부족', '보통', '많음']
    pd.cut(df2['운동량'], bins, labels=labels, right=False)
  • 10개의 그룹으로 나누기
    df2['운동량_cut'] = pd.cut(df2['운동량'], bins=10)
    df2['운동량_cut'].value_counts()

분포를 보면 첫 구간에 대부분의 데이터가 쏠려있음 pd.cut()은 최소에서 최대 구간을 지정한 bin만큼 동일하게 분할하기 때문에 이런 형상이 발생. 고른 데이터라면 괜찮지만 튀는 이상치가 있는 경우 안좋은 결과 초래

pd.qcut() - 동일한 개수를 갖도록 구간 분할

pd.cut()과 유사하지만, quantity 즉 데이터의 분포를 최대한 비슷하게 유지하는 구간을 분할 합니다.

df2[‘운동량_qcut’] = pd.qcut(df2[‘운동량’], q=10)

  • 임의의 범위 조정 qcut_bins = [0, 0.2, 0.8, 1] pd.qcut(df2['운동량'], qcut_bins)
  • qcut 역시 label을 지정할 수 있습니다. 마찬가지로 범위 수보다 1개 적게 설정합니다. qcut_labels = ['적음', '보통', '많음'] pd.qcut(df2['운동량'], qcut_bins, labels=qcut_labels).value_counts()
This post is licensed under CC BY 4.0 by the author.