pandas 기초
- CSV 파일 불러오기: pandas 라이브러리 불러오기
import pandas as pd
df_ins= pd.read_csv("./data/insurance.csv")
display(df_ins)
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
... ... ... ... ... ... ... ...
1333 50 male 30.970 3 no northwest 10600.54830
1334 18 female 31.920 0 no northeast 2205.98080
1335 18 female 36.850 0 no southeast 1629.83350
1336 21 female 25.800 0 no southwest 2007.94500
1337 61 female 29.070 0 yes northwest 29141.36030
1338 rows × 7 columns
pandas의 read_csv( ) 활용
print(type)(df_ins)
pandas.core.frame.DataFrame
타입확인
- 데이터 살펴보기
df_ins.head(10)
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
5 31 female 25.740 0 no southeast 3756.62160
6 46 female 33.440 1 no southeast 8240.58960
7 37 female 27.740 3 no northwest 7281.50560
8 37 male 29.830 2 no northeast 6406.41070
9 60 female 25.840 0 no northwest 28923.13692
head( )로 앞 몇 개 관측치 확인
df_ins.tail()
age sex bmi children smoker region charges
1333 50 male 30.97 3 no northwest 10600.5483
1334 18 female 31.92 0 no northeast 2205.9808
1335 18 female 36.85 0 no southeast 1629.8335
1336 21 female 25.80 0 no southwest 2007.9450
1337 61 female 29.07 0 yes northwest 29141.3603
tail( )로 끝 몇 개 관측치 확인
# .shape : 관측치/ 변수 개수 확인(행렬 갯수), 튜플
df_ins.shape
결과: (1338, 7)
# 관측치 개수만 확인(튜플의 첫번째 수 = 행의 갯수만 확인 가능)
df_ins.shape[0]
결과: 1338
# .index : index(행 이름) 확인
df_ins.index
결과: RangeIndex(start=0, stop=1338, step=1)
# .colums : columns(변수 이름) 확인
df_ins.columns
결과: Index(['age', 'sex', 'bmi', 'children', 'smoker', 'region', 'charges'], dtype='object')
# dtypes : 변수 형식 확인
df_ins.dtypes
결과: age int64
sex object
bmi float64
children int64
smoker object
region object
charges float64
dtype: object
- Encoding 지정 및 index, header 지정
pd.read_csv('./data/고용지표_20221115084415.csv', encoding='CP949', index_col=0, header=[0,1])
encoding='CP949' (인코딩을 지정하지 않으면 오류 발생)
index_col=0 ( 첫 번째 열의 값들이 행 인덱스로 사용)
header=[0,1] (첫 번째 행(인덱스 0)과 두 번째 행(인덱스 1)을 열 헤더로 사용하도록 지정합니다)
- Excel 파일 불러오기
sheet2 = pd.read_excel('./data/test.xlsx', sheet_name=[0,1], skiprows=2)
sheet2
{0: 2 54 32 34
0 4 65 43 54,
1: 이름 나이 키
0 민서 20 160
1 민준 21 175}
sheet_name : 시트 이름이나 번호 지정, 번호는 0부터 시작
skiprows : 무시할 행 수
데이터 전처리 기초
1. 데이터 결합
- concat() : 구조는 똑같고 기간이나 상품만 다른 여러 데이터가 있으면 pandas의 concat()으로 결합해서 활용, 함수 안에서 axis=0옵션을 활용해서 행 결합(아래로 이어 붙이기)을 할 수 있고, axis=1로 열 결합도 가능
axis=0이 기본값며 생략 가능
#인덱스가 겹치고 있음 (df_apt1의 인덱스 0~235,df_apt2의 인덱스 0~73, df_apt3의 인덱스 0~75가 그대로 남아있음
#axis= 0일떈 행방향, axis = 1일떈 열 방향
df_apt = pd.concat([df_apt1, df_apt2, df_apt3], axis=0)
df_apt
결합 이전 기존 Index 활용으로 0 인덱스 관측치의 중복 발생, 행 결합이나 정렬 이후 인덱스를 재지정하거나 초기화 필요
df_apt.reset_index(inplace = True)
reset_index() 는 행 인덱스를 초기화하고, 기존의 행 인덱스를 새로운 열로 추가하는 기능을 제공
inplace=True 옵션을 사용하면 원본 데이터를 직접 수정
[실습] 데이터 결합 및 인덱스 초기화
- data폴더의 CARD_SUBWAY_MONTH_로 시작하는 3개 데이터 확인하기
- 1.의 데이터를 각각 불러와서 저장하고, pd.concat()으로 행 결합하기(encoding='CP949' 활용)
- index 초기화 하기
import pandas as pd
from glob import glob
# './data/CARD_SUBWAY_MONTH*.csv' 패턴의 파일 경로들을 path_list 변수에 저장
path_list = glob('./data/CARD_SUBWAY_MONTH*.csv')
# 아래 주석된 코드는 직접 파일 경로를 지정한 예시입니다
# path_list = [
# './data/CARD_SUBWAY_MONTH_201907.csv',
# './data/CARD_SUBWAY_MONTH_202007.csv',
# './data/CARD_SUBWAY_MONTH_202107.csv'
# ]
# 빈 리스트 df_list를 생성
df_list = []
# path_list에 있는 각 파일 경로에 대해 반복 수행
for _path in path_list:
# 해당 파일을 읽어들여 데이터프레임 df_i 생성 (encoding='CP949' 옵션 사용)
df_i = pd.read_csv(_path, encoding='CP949')
# df_list에 df_i 추가
df_list.append(df_i)
# 아래 주석된 코드는 각 파일을 개별적으로 읽어들이는 예시입니다
# df_subway1 = pd.read_csv('./data/CARD_SUBWAY_MONTH_201907.csv', encoding='CP949')
# display(df_subway1)
# df_subway2 = pd.read_csv('./data/CARD_SUBWAY_MONTH_202007.csv', encoding='CP949')
# display(df_subway2)
# df_subway3 = pd.read_csv('./data/CARD_SUBWAY_MONTH_202107.csv', encoding='CP949')
# display(df_subway3)
# df_list에 개별 데이터프레임을 추가하는 코드
# df_list.append(df_subway1)
# df_list.append(df_subway2)
# df_list.append(df_subway3)
# df_list에 있는 모든 데이터프레임을 세로로 병합하여 df_subway 데이터프레임 생성
df_subway = pd.concat(df_list, axis=0)
display(df_subway)
# df_subway 데이터프레임의 기존 인덱스를 제거하고 새로운 연속적인 인덱스를 생성
df_subway.reset_index(inplace=True, drop=True)
df_subway
- merge()를 활용한 KEY 변수 기준 결합
how= 옵션을 활용해서 다음과 같은 데이터 결합 방법 지정
- inner: inner join. key 기준 일치하는 관측치만 포함(교집합)
- left: left join. inner join의 결과물과 왼쪽 데이터의 짝 없는 관측치 포함
- right: right join. inner join의 결과물과 오른쪽 데이터의 짝 없는 관측치 포함
- outer: full outer join. inner join과 양쪽 데이터의 짝이 없는 모든 관측치 포함(합집합)
pd.merge(df_left, df_right, how='inner', on='category')
pd.merge(df_left, df_right, how='left', on='category')
pd.merge(df_left, df_right, how='right', on='category')
pd.merge(df_left, df_right, how='outer', on='category')
2.데이터 부분 선택
- 데이터프레임의 변수(열) 선택 방법
# .을 활용한 하나의 변수(열) 선택 (공백이 포함된 변수명일 경우 사용 불가)
df_ins.region
#위 방법보다 이 방법을 더 추천함(공백이 있을 경우 위 방법은 사용불가)
df_ins['smoker']
0 yes
1 no
2 no
3 no
4 no
...
1333 no
1334 no
1335 no
1336 no
1337 yes
Name: smoker, Length: 1338, dtype: object
- 대괄호를 활용한 데이터 부분 선택
df_ins['age']
한 변수 선택
x =['age','smoker','charges']
df_ins[x]
리스트를 활용한 복수 변수 선택(시리즈가 여러개 모여 데이터 프레임 으로 변함)
x = df_ins[['age','smoker','charges']][0:5] #행 5개, 열 3개
x.shape[0]
age smoker charges
0 19 yes 16884.92400
1 18 no 1725.55230
2 28 no 4449.46200
3 33 no 21984.47061
4 32 no 3866.85520
관측치 선택(슬라이싱 = 행 선택)
- loc과 iloc을 활용한 관측치/변수 선택
df_ins2 = df_ins.copy()[0:10]
df_ins2['idx'] = list(range(101, 111))
df_ins2.set_index('idx', inplace=True)
display(df_ins2[0:2])
age sex bmi children smoker region charges
idx
101 19 female 27.90 0 yes southwest 16884.9240
102 18 male 33.77 1 no southeast 1725.5523
원본 데이터를 복제(copy)하고 부분선택
idx 인덱스를 별도로 지정
- loc
df_ins2.loc[101:103, 'smoker':'charges']
df_ins2.loc[:, 'smoker':'charges']
.loc[start:end] start부터 end까지 찾음 , .loc[행 선택조건,열 선택조건]
열 선택 조건 : smoker 부터 region까지 , 변수이름 슬라이스:를 활용 가능
모든 관측치 선택할 때는 :
- iloc
df_ins2.iloc[0:3, [0,3,4]]
display(df_ins2.iloc[0:5:2])
age sex bmi children smoker region charges
idx
101 19 female 27.90 0 yes southwest 16884.9240
103 28 male 33.00 3 no southeast 4449.4620
105 32 male 28.88 0 no northwest 3866.8552
'ABC 부트캠프 데이터 탐험가 4기' 카테고리의 다른 글
[9 일차] ABC 부트캠프 : 데이터 집계와 시각화(1) (0) | 2024.07.16 |
---|---|
[8일차] ABC 부트캠프 : pandas 기초 , 데이터 전처리 기초(2) (0) | 2024.07.16 |
[6일차] ABC 부트캠프 : Jupyter Notebook 활용 및 Python 기초 (4) (0) | 2024.07.12 |
[5일차] ABC 부트캠프 : Jupyter Notebook 활용 및 Python 기초 (3) (0) | 2024.07.11 |
[4일차] ABC 부트캠프 : Jupyter Notebook 활용 및 Python 기초 (2) (0) | 2024.07.11 |