Milky's note

[Part 1] Pandas(전처리) 본문

Python/요약 정리

[Part 1] Pandas(전처리)

밀뿌 2021. 12. 13. 00:22

1. 결측값 처리

#결측값 채우기(fillna)
df['키'].fillna(-1)
df2['키'].fillna(-1, inplace=True) #값을 바로 대입

#결측값 삭제(dropna)
df.dropna()
df.dropna(axis=0) #axis를 사용하여 행 또는 열을 제거
df.dropna(axis=0, how='any') #한개라도 있는 경우
df.dropna(axis=0, how='all') #모두 NaN인 경우

#중복된 값 제거 (drop_duplicates)
df['키'].drop_duplicates()
df['키'].drop_duplicates(keep='last') #맨마지막 항목 유지
df['키'].drop_duplicates(keep='first') #맨처음 항목 유지

#행 전체 제거
df.drop_duplicates('그룹')
df.drop_duplicates('그룹', keep='last')

행 전체 제거를 하지 않고, 중복된 값 제거를 하게 되면 해당 데이터가 NaN으로 바뀜
행 전체 제거를 하면 중복된 행이 모두 삭제

2. 삭제(Column, Row)

#Column 삭제(axis=1)
df.drop('그룹', axis=1)
df.drop(['그룹', '소속사'], axis=1) #복수일 때에는 list로

#Row 삭제(axis=0, index)
df.drop(3, axis=0)
df.drop([3, 5], axis=0) #복수일 때에는 list로

Row를 삭제할 때에는 index값으로 삭제한다.

3. DataFrame 합치기

concat과 merge는 단순 합치는 목적과 특정 기준(index)으로 합치느냐에 따라 용도가 다르다.

  • concat: row나 column 기준으로 단순하게 이어 붙히기
  • merge: 특정 고유한 키(unique id) 값을 기준으로 병합하기

3.1 Concat

#Row 기준 합치기
row에 합칠 때는 pd.concat에 합칠 데이터프레임을 list로 합친다.
row 기준으로 합칠 때는 sort=False 옵션을 주어 순서가 유지되도록 한다.

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

합치고 난 뒤, index가 꼬이는데 이를 초기화한다.
하지만, index라는 column이 추가 되는데, drop=True 옵션으로 새로 index column이 생성되지 않도록 한다.

df_concat.reset_index(drop=True)

#Column 기준 합치기
column을 기준으로 합치고자 할 때는 axis=1 옵션을 준다.

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

행의 갯수가 맞지 않는 상태에서 column concat을 하면, 해당 되는 index값에 맞게 알아서 concat 된다.

3.2 Merge

pd.merge(left, right, on='기준column', how='left')

  • left와 right는 병합할 두 DataFrame을 대입한다.
  • on 에는 병합의 기준이 되는 column을 넣어 준다.
  • how 에는 'left', 'right', 'inner', 'outer' 라는 4가지의 병합 방식중 한 가지를 선택한다.
#left, right 방식
'left' 옵션을 부여하면, left DataFrame에 키 값이 존재하면 해당 데이터를 유지하고, 병합한 right DataFrame의 값의 NaN이 대입 된다.
'right' 옵션을 부여하면 right DataFrame을 기준으로 병합한다.
데이터 수가 더 적은 쪽으로 병합하면, 행이 줄어든다.

pd.merge(df, df_right, on='이름', how='left')
pd.merge(df, df_right, on='이름', how='right')


#inner, outer 방식
inner 방식은 두 DataFrame에 모두 키 값이 존재하는 경우만 병합한다.
outer 방식은 하나의 DataFrame에 키 값이 존재하는 경우 모두 병합한다.
outer 방식에서는 없는 값은 NaN으로 대입된다.

pd.merge(df, df_right, on='이름', how='inner')
pd.merge(df, df_right, on='이름', how='outer')



#column명은 다르지만, 동일한 성질의 데이터 인 경우
예를 들어, df에서는 '이름', df_right에서는 '성함'으로 표기되어 기준이 되는 column을 지정할 수 없을 경우에는
left_on, right_on 옵션을 사용한다.

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

4. 데이터 타입 변경

  • type 변환을 위해서는 astype이라는 메소드를 사용
    df['키'].astype(int) 
  • 날짜를 변환하기 위해서는 판다스 메소드인 to_datetime이라는 메소드를 사용
    pd.to_datetime(df['생년월일'])
    • 매우 손쉽게, 월, 일, 요일 등등의 날짜 정보를 세부적으로 추출해낼 수 있음
    • datetime의 약어인 'dt'에는 다양한 정보들을 제공
df['생년월일'].dt.year
df['생년월일'].dt.month
df['생년월일'].dt.day
df['생년월일'].dt.hour
df['생년월일'].dt.minute
df['생년월일'].dt.second
df['생년월일'].dt.dayofweek #일주일의 몇 요일
#월요일: 0 화요일: 1, 수요일: 2, 목요일: 3, 금요일: 4, 토요일: 5, 일요일: 6
df['생년월일'].dt.weekofyear #일년의 몇 주차​

5. 구체적인 로직 적용

5.1 Apply

  • apply를 적용하기 위해서는 함수가 먼저 정의되어야 한다.
  • apply는 정의한 로직 함수를 인자로 넘겨준다.
# 먼저 apply에 활용할 함수를 정의한다.
[주의] 함수는 반드시 return 값이 정의 되어야한다.

def male_or_female(x):
    if x == '남자':
        return 1
    elif x == '여자':
        return 0
        
        
df['성별'].apply(male_or_female)


# 먼저 apply에 활용할 함수를 정의한다.
def cm_to_brand(df):
    value = df['브랜드평판지수'] / df['키']
    return value
    
    
df.apply(cm_to_brand, axis=1)

 

5.2 lambda 함수

  • lambda는 1줄로 작성하는 간단 함수식
  • return을 별도로 명기하지 않는다.
  • 간단한 계산식을 정의할 때 많이 사용한다.
  • APPLY 함수 말고 MAP 함수 안에서 사용해도 무방하다.
df['키'].apply(lambda x: x / 2)
df['키'].apply(lambda x: x ** 2)
df['출석'].apply(lambda x: 1 if x == 'Y' else 0)

5.3 map(값을 매핑)

  • 딕셔너리를 사용해서  key-value로 값을 매핑해주고 사용한다.
my_map = {
    '남자': 1,
    '여자': 0
}


df['성별'].map(my_map)

6. 데이터 타입별 column 선택 (select_dtypes)

#문자열이 있는 column 만 선택
df.select_dtypes(include='object')

#숫자형 column 만 선택
df.select_dtypes(exclude='object')

num_cols = df.select_dtypes(exclude='object').columns
obj_cols = df.select_dtypes(include='object').columns

7. 원핫인코딩 (One-hot-encoding)

  • 원핫인코딩은 한개의 요소는 True 그리고 나머지 요소는 False로 만들어 주는 기법
blood_map = {
    'A': 0, 
    'B': 1,
    'AB': 2, 
    'O': 3,
}


df['혈액형_code'] = df['혈액형'].map(blood_map)
df['혈액형_code'].value_counts()
  • 우리가 만약 df['혈액형_code']를 머신러닝 알고리즘에 그대로 넣어 데이터를 예측하라고 지시한다면, 컴퓨터는 '혈액형_code'안에서 값들간의 관계를 스스로 형성하게 된다.
  • 이 상황에서 만약 B형은 1, AB형은 2라는 값을 가지고 있는데, 컴퓨터는 B형 + AB형 = O형이다라고 잘못 관계를 맺을 수 있게 된다.
  • 따라서, 우리는 4개의 별도의 column을 형성해주고 1개의 column에는 True 나머지는 모두 False를 넣어 줌으로써 A, B, AB, O형의 관계는 독립적이다를 표현해준다.
  • 이를 원핫인코딩이라고 한다.
pd.get_dummies(df['혈액형_code'])

#prefix 설정
pd.get_dummies(df['혈액형_code'], prefix='혈액형')

 

'Python > 요약 정리' 카테고리의 다른 글

[Part 2] 시각화-바그래프  (0) 2022.01.19
[Part 2] 시각화-라인그래프  (0) 2022.01.10
[Part 1] Pandas(기본 설명)  (0) 2021.12.12
[참고 링크]  (0) 2021.12.02
[Part 1] Numpy  (0) 2021.12.01
Comments