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')
- int32 :
- Category 타입 관련
- .cat으로 접근하여 category 타입이 제공하는 attribute를 사용
- 주요 옵션 값
- 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.