ABC 부트캠프 데이터 탐험가 4기

[7일차] ABC 부트캠프 : pandas 기초 , 데이터 전처리 기초(1)

marriina 2024. 7. 14. 06:02

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 옵션을 사용하면 원본 데이터를 직접 수정

 

[실습] 데이터 결합 및 인덱스 초기화

출처 : 서울시 지하철 호선별 역별 승하차 인원수

  1. data폴더의 CARD_SUBWAY_MONTH_로 시작하는 3개 데이터 확인하기
  2. 1.의 데이터를 각각 불러와서 저장하고, pd.concat()으로 행 결합하기(encoding='CP949' 활용)
  3. 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