[데이터 분석 입문] 데이터 전처리 | 기본 문법
💡 데이터의 목적 -> "설득" -> 데이터를 잘 전달해야 함 -> "시각화" -> 목적에 맞는 데이터 "전처리"
데이터를 불러와서 전처리할 때 자주 사용할 것 같은 기본적인 문법들을 정리해 보았다.
Pandas 라이브러리
- 파이썬에서 데이터 조작과 분석을 위한 가장 핵심적인 라이브러리. 전처리 작업의 핵심 도구
pip install pandas # 설치 (터미널/명령프롬프트에서)
import pandas as pd # 라이브러리 import
데이터 구조
- Series (1차원 데이터) : 하나의 컬럼으로 이루어진 1차원 배열
- DataFrame (2차원 데이터): 여러 개의 컬럼으로 이루어진 2차원 테이블. 여러 개의 Series가 모여서 만들어진 구조
# 리스트로부터 Series 생성
ages = pd.Series([25, 30, 35, 28, 32])
# 딕셔너리로부터 DataFrame 생성
data = {
'name': ['김철수', '이영희', '박민수', '최지은'],
'age': [25, 30, 35, 28],
'city': ['서울', '부산', '대구', '인천']
}
df = pd.DataFrame(data)
데이터 불러오기
# pd.read_확장자('파일경로/파일명.확장자')
# 엑셀 불러오기
pd.read_excel('./파일명.xlsx') # ./ ==> 현재 내가 있는 위치라는 의미
# 주요 옵션들과 함께 읽기
df = pd.read_csv('data.csv',
encoding='utf-8', # 한글 인코딩
index_col=0, # 첫 번째 컬럼을 인덱스로
header=0, # 첫 번째 행을 컬럼명으로
sep=',', # 구분자 지정
na_values=['N/A', '']) # 결측치로 처리할 값들
데이터 저장하기
# pd.to_확장자(’파일경로/파일명.확장자’, index = False or True)
df.to_csv('./newfile.csv', index = False)
데이터 정보 확인
data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌
data.info() # 인덱스, 컬럼명, 컬럼의 데이터 개수, 데이터 타입
data.describe() # 숫자값 기초통계량(개수, 평균, 표준편차, 사분위, 중앙값)
# describe()도 데이터프레임이므로 체인룰로 활용 가능하다
데이터 선택
- 열(Column) 선택
# 컬럼 확인하기
df.columns
# 각 컬럼 선택하기
df['컬럼명']
df[ ['컬럼명1','컬럼명2','컬럼명3'] ]
# 모든 컬럼명 변경하기
df.columns = ['컬럼명1','컬럼명2']
# 특정 컬럼명 변경하기
df.rename(columns={'컬럼A': '컬럼B'})
# 새로운 컬럼 추가하기
df['컬럼C'] = data # 컬럼C의 모든 행에 data 값이 적용됨
df['컬럼C'] = [1,2,3] # 전체 행 수에 맞춰서 입력해줘야함
df['컬럼C'] = df['컬럼A'] / df['컬럼B'] + 1 # 여러 조건 및 계산식의 산출 값으로도 추가가 가능
- 행(Row) 선택
- .iloc[행번호, 열번호] : 슬라이싱과 같은 문법 - 마지막 인덱스 포함 X
- .loc['행이름', '열이름']: 라벨 기반으로 직관적임 - 마지막 인덱스 포함 O (loc 추천)
# .iloc: 인덱스 번호로 선택하기
df.iloc[1:4, 0:2] # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
# .loc: 이름으로 선택하기
df.loc[1:4, 'A':'B'] # 레이블 1부터 4까지의 행과 'A'부터 'B'까지의 열 선택
인덱스
# 사용자가 직접 인덱스를 설정한 데이터프레임 생성 (기본은 정수 인덱스)
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['idx1', 'idx2', 'idx3'])
# 특정 인덱스의 행에 접근
row = df.loc['idx2']
# 인덱스를 기준으로 데이터프레임 정렬
sorted_df = df.sort_index()
# df가 가지고 있는 특정 컬럼명을 기준으로 인덱스를 설정하기
data = df.set_index('컬럼명')
#인덱스 확인하기
data.index
#리스트 형태를 활용해서 새로운 인덱스 입력
data.index = ['1번' , '2번' , '3번']
불리언 인덱싱
- 데이터 프레임 안에 [ ] 형태의 조건을 넣어 데이터를 필터링하는 방법
- 조건을 변수로 할당해서 사용하면 깔끔하고 수정하기 편함
# 여러 조건으로 필터링
df[(df['age'] >= 30) & (df['gender'] == 'Male')] # 'age' 열에서 30세 이상이면서 'gender' 열이 'Male'인 행 필터링
# 조건에 따른 특정 컬럼 필터링
df.loc[df['age'] >= 30, 'name'] # 'age' 열에서 30세 이상인 경우의 'name' 열만 선택
# isin()을 활용한 필터링
df[df['gender'].isin(['Male', 'Female'])] # 'gender' 열에서 'Male' 또는 'Female'인 행 필터링
데이터 타입
# 데이터 타입 확인
df['컬럼명'].dtype
# 데이터 타입 변경
df['컬럼명'].astype(타입) # 변환 불가능한 값이 있으면 에러남
pd.to_numeric(df['컬럼명'], errors='coerce') # 문자열을 숫자로 변환하되, 변환할 수 없는 값은 NaN으로 처리
pd.to_datetime(df['컬럼명']) # 날짜 데이터로 변환 (날짜 간 계산 가능)
df['날짜 데이터'].dt.year # 날짜에서 년(year), 월(month), 일(days), 요일(day_name)등 추출 가능
데이터 병합
- concat( ) : 데이터프레임을 위아래로 혹은 좌우로 연결
pd.concat([df1, df2], axis=0) # 위아래로 연결 (기본값)
pd.concat([df1, df2], axis=1) # 좌우로 연결
# 행, 열 크기가 같지 않으면 남는 값은 NaN으로 표현됨
- merge( ) : 공통된 열이나 인덱스를 기준으로 데이터를 병합
pd.merge(left_df, right_df, on='병합의 기준이 되는 열', how='inner/outer/left/right')
# 'inner' : 공통된 열을 기준으로 교집합
# 'outer' : 공통된 열을 기준으로 합집합
# 'left' : 왼쪽 데이터프레임의 모든 행을 포함하고 오른쪽 데이터프레임은 공통된 열에 해당하는 행만 포함
# 'right' : 오른쪽 데이터프레임의 모든 행을 포함하고 왼쪽 데이터프레임은 공통된 열에 해당하는 행만 포함
데이터 집계
- groupby( ) : 그룹화의 기준이 되는 열이 인덱스가 됨
- pivot_table( ) : 데이터를 재구성하여 요약, 집계된 정보를 보여주는 테이블
데이터 정렬
df.sort_values('컬럼명') # 특정 열을 기준으로 오름차순 정렬
df.sort_values('컬럼명', ascending=False) # '특정 열을 기준으로 내림차순 정렬
df.sort_index() # 인덱스를 기준으로 오름차순 정렬
결측치, 중복 데이터
- 도메인 지식을 활용해 결측치를 적절하게 채워 넣어야 함
df.isnull().sum() # 결측치 확인 + 결측치 개수
df.dropna() # 결측치 제거
df.duplicated() # 중복 데이터 확인
df.drop_duplicates(subset=['컬럼1', '컬럼2']) # 중복 데이터 제거 (subset옵션: 특정 열 기준 중복 제거)
User Guide — pandas 2.2.3 documentation
User Guide The User Guide covers all of pandas by topic area. Each of the subsections introduces a topic (such as “working with missing data”), and discusses how pandas approaches the problem, with many examples throughout. Users brand-new to pandas sh
pandas.pydata.org
📎 User Guide - pandas documentation
- 판다스 메서드, 속성들을 모두 외울 필요는 없음
- 어떤 기능이 있구나만 인지하고 있고, 특정 기능이 필요할 때 Pandas 공식 문서의 User Guide를 참고하자