본문 바로가기

전처리 및 시각화

데이터 전처리(저장 및 불러오기/인덱스/컬럼/데이터 확인/결측치/중복/이상치/데이터 타입)

pandas에서 사용되는 대표적인 데이터 오브젝트

- 시리즈(Series) : 1차원 배열 / 인덱스라는 한 가지 기준에 의하여 데이터가 저장된다. (행)

- 데이터프레임(DaraFrame) : 2차원 배열 / 인덱스와 컬럼 두 가지 기준에 의하여 표 형태로 데이터가 저장된다. (행열)

--------------------------------------------------------------------------------------------------------------------------------------------------------

# 데이터 저장 및 불러오기

# pd.read_excel('파일경로/파일명.확장자')
# pd.read_csv('파일경로/파일명.확장자')

# 엑셀 불러오기
pd.read_excel('./파일명.xlsx')   # ./ ==> 현재 내가 있는 위치라는 의미

# csv 파일 불러오기
pd.read_csv('./파일명.csv')
import pandas as pd

# UTF-8 인코딩으로 파일 불러오기
data = pd.read_csv('file.csv', encoding='utf-8')

# ASCII 인코딩으로 파일 불러오기
data = pd.read_csv('file.csv', encoding='ascii')

파일이 깨져서 불러와질때 인코딩 방법을 달리해서 불러온다. (utf-8   euc-kr 등)

 

 

Seaborn 이라는 라이브러리에서 불러올 수 있는 내장 데이터셋

(iris, tips, titanic, flights, planets 데이터셋)

import pandas as pd
import seaborn as sns
data = sns.load_dataset('tips')

tips 라는 이름을 가진 데이터를 불러오는 코드 - 데이터프레임 형태의 데이터셋을 가져온다.

data.to_csv("tips_data.csv")
data.to_csv("tips_data.csv", index=False)

data.to_csv 라는 메서드를 활용하여 현재위치에 tips_data.csv 라는 파일명을 가진 파일을 만들거라는 코드

앞서 언급한 data 라는 파일에 파일명이 tips_data.csv 이고 csv 파일로 저장할거다. 라는 뜻이다.

즉, 데이터 전처리가 끝난 데이터를 파일화 시키는 것이다.

## 인덱스를 표시하지 않기 위해 index=False 를 추가하여 저장하기 / 인덱스 기본값은 True 이다. ##

df = pd.read_csv("tips_data.csv")

파일화 시킨 tips_data.csv 파일을 다시 불러오는 코드이다.

df = pd.read_csv("tips_data.csv", index_col=0)

저장할때 index=False 를 설정하지 않았을시, 불러올때에 인덱스를 제거하는 코드이다. index_col=0 을 추가한다.

df.to_csv("temp/tips_data.csv", index=False)

temp 라는 파일에 해당 파일을 저장하겠다는 코드이다.

df.to_excel("temp/tips_data.xlsx", index=False)

엑셀 파일로 저장하는 코드이다.

# 경로를 지정해서 파일을 저장하는 방법

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 인덱스

df = pd.DataFrame({
    'A': [1,2,3],
    'B': ['a', 'b', 'c']
}, index=['idx3', 'idx2', 'idx1'])

어떤 데이터프레임의 인덱스를 설정할때에 인덱스의 기본값은 0,1,2,... 로 설정되어 있고,

각 인덱스를 특정지어 줄때에 해당 데이터프레임 뒤에 따로 인덱스 이름을 지정해준다.

df.loc['idx2']

idx2 로 지어진 인덱스의 행의 데이터를 가져와라는 코드이다.

df.sort_index()

인덱스의 순서를 정리해서 데이터프레임을 정렬하는 코드이다.

df.set_index('A')

A라는 컬럼으로 인덱스를 사용하겠다는 코드이다. 즉 A의 요소가 인덱스로 된다.

df.index

인덱스의 값이 어떻게 구성되어 있고, 타입은 무엇인지를 알려주는 코드이다.

df.index = ['1', '2', '3']

인덱스를 변경하는 코드이다.

df.reset_index()

인덱스의 기본값을 추가해주는 코드이다.

df.reset_index(drop=True)

앞서 언급한 모든 인덱스를 제거하고 인덱스를 기본값(0,1,2,...)으로 설정하는 코드이다.

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 컬럼

data = {
    'name' : ['Alice', 'Bob', 'Charlie'],
    'age' : [25, 30, 35],
    'gender' : ['female', 'male', 'male']
}

df = pd.DataFrame(data)

위의 데이터프레임을 활용한다.

df['age']

age 라는 컬럼의 값들을 가져온다.

df.columns

현재 컬럼의 이름이 어떻게 구성되었는지, 타입은 무엇인지 확인한다.

df.columns = ['이름', '나이', '성별']

컬럼명을 변경한다.

df.rename(columns={'이름': 'name', '나이': 'age', '성별': '남/여'})

컬럼명인 key 값을 value 값으로 바꾸는 코드이다. 딕셔너리를 사용한다.

df['스포츠'] = '축구'

스포츠라는 컬럼에 축구라는 값으로 전부 추가한다.

del df['스포츠']

스포츠라는 컬럼을 삭제한다.

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 데이터 확인 - 다양한 메서드를 활용   >>>     .head()    .info()    .describe()

df = pd.read_csv("temp/tips_data.csv")

먼저 어떠한 데이터프레임을 불러온 뒤에

df.head()

기본값으로 5개의 행에 대한 정보(인덱스 0~4)를 가져오고, 괄호 안에 숫자를 지정해서 원하는 갯수의 행을 불러온다.

df.info()

데이터프레임에 대한 정보를 확인한다.

데이터 타입 / 컬럼에 대한 null 값이 몇 개가 있는지 등

df.describe()

count 값이 몇개인지 / mean 평균 / std 표준편차 / 최대 최소 4분위 값에 대한 메소드

숫자 타입을 가진 컬럼 값들만 확인 가능하다.

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 결측치 확인

df = pd.DataFrame({
    'A': [1,2,3,4],
    'B': [5,6,7,None]
})

위의 데이터프레임을 불러온 뒤에

df.info()

먼저 info를 통해 Non-Null Count 를 통해서 어떤 컬럼에 null 값이 있는지 확인할 수 있다.

df.isna()

True 값이 null 값이다.

df['B'].isna()

B 컬럼에 대한 값도 확인 가능하다.

df[df['B'].isna()]

데이터프레임 안에서 True인 값만 불러와라는 df 함수를 통해서 특정 컬럼의 null 값인 것만 확인할 수 있다.

 

 

# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있다

# 결측치 제거 : dropna()
df.dropna()

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 중복 데이터

# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])

# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 데이터 이상치

# IQR 계산
Q1 = df['컬럼1'].quantile(0.25)
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

# 데이터 타입

df = pd.read_csv("temp/tips_data.csv")

위의 데이터프레임을 불러온 뒤에

df.info()

위 코드를 통해서 데이터 타입을 확인할 수 있다.

df['total_bill'].dtype

각 컬럼별로 데이터 타입을 확인할 수 있다.

df['total_bill'] = df['total_bill'].astype(str)

위 코드를 통해 원래 float 에서 object 로 타입을 변경할 수 있다. 할당을 해준 것.

df['total_bill'].astype(float) .astype(int)

다시 float으로 변경하고, int 값으로 변경하면 정수로 변한다. 타입이 맞지 않으므로 바로 int로 바꿀 수 없기 때문이다.

 

# 데이터 타입 추가 자료

# 데이터 타입 변경을 원한다면 ! 
df['column_name'].astype(int)
df['column_name'].astype(float)
df['column_name'].astype(str)
df['column_name'].astype(bool)
df['column_name'].astype('category')
df['column_name'].astype('datetime64[ns]')
df['column_name'].astype(complex)
df['column_name'].astype(object)