일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- GROUPBY
- matplotlib
- Limit
- SQL
- 데이터리안 웨비나
- 그로스해킹
- solvesql
- pandas
- 데이터시각화
- TRUNCATE
- 파이썬
- Round
- join
- SQLite
- 전처리
- 머신러닝
- hackerrank
- Oracle
- 데이터분석
- not in
- airflow 설치
- mysql :=
- 프로그래머스
- seaborn
- SUM
- having
- PostgreSQL
- MySQL
- 다중 JOIN
- 결측값
Archives
- Today
- Total
Milky's note
[Part 1] Pandas(전처리) 본문
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