DB

데이터 전처리 - 판다스(Pandas) 사용 및 csv 파일 데이터 처리

s2h15 2023. 11. 28. 14:54
728x90

판다스(Pandas)

- 행렬 데이터를 처리하기 위한 다양한 함수를 지원하는 라이브러리
- 파일 읽기, 저장, 행렬데이터 처리, 기본 시각화 등 지원
- 데이터 전처리 과정에서 주로 사용

 

<데이터 분석과정>
데이터 수집 > 데이터 전처리 > 데이터 가공(필요시 전처리)
> 데이터 분석 탐색/시각화(필요시 전처리) > 필요시 모델 훈련(머신러닝 or 딥러닝)
> 웹서비스 또는 분석보고서

* 일반적으로 책에서는 : 데이터 수집 > 전처리 > 분석 > 시각화 로 설명되고 있음
* 분석과정은 회사에 따라 다름

 

 

pip list 통해 설치되어있는 라이브러리 확인 가능

conda list > 아나콘다 설치시 pip list와 동일하게 사용 가능

 

<데이터 수집 시 확인 사항>
- 날짜 확인 : 기준일로 사용
- 범주형 데이터 확인 : 예로 남자 또는 여자와 같은 데이터

 

데이터 전처리

 

 

데이터 읽어들이기

file_path = "./files/sample_1.xlsx"
# file_path = "C:\Users\user\gj202311\04_데이터_처리_시각화\01_데이터_전처리기초\files" # 절대 경로

 

▶ 먼저 파일 경로를 절대 경로 또는 상대 경로로 지정해준다. 파일의 위치를 변경할 수 있으므로 상대경로로 지정해주는 것이 좋다.

 

sample_1 = pd.read_excel(file_path, header = 1 ,skipfooter = 2, usecols = "A:C")

 

  파일 데이터 추출하기
- 첫번째 : 파일 지정(위치 포함)

- 두번째 : 컬럼명으로 사용할 행의 위치(디폴트 0)
- 세번째 : 행의 가장 밑에서 포함하지 않을 행의 개수(디폴트 0)
- 네번째 : 가지고 올 열의 범위(A부터 C까지의 열) -> 디폴트 데이터가 있는 모든 열

 

sample_1.info()

 

 

 데이터프레임 정보 확인하기

- DataFrame 타입 : 행렬을 저장 관리하는 타입
- info() 함수는 데이터의 결측치(non,null) 데이터 확인 가능 (중요)
- RangeIndex : 전체 행(row)의 개수
- 전체 행의 개수와 각 컬럼의 개수(Non-Null의 개수)가 안맞으면 -> 결측데이터가 존재한다는 의미

 

 

 

 

 

 

 

sample_1

 

 데이터프레임 출력

- 데이터 행/열이 많은 경우 -> 기본 상위 5개 , 하위 5개를 추출해서 보여줌
- 데이터 행/열의 개수가 작으면 모두 보여줌

 

왼쪽은 sample_1엑셀 데이터 오른쪽은 sample_1 데이터 프레임 출력

sample_1.head()
sample_1.head(1)

sample_1.tail()
sample_1.tail(1)

 

  head(개수) : 상위 데이터 조회 / tail(개수) : 하위 데이터 조회

왼쪽은 head() 오른쪽은 head(1)일때

 

sample_1.describe()

  기초통계 데이터 

- count : 데이터 행의 개수
- mean : 데이터 평균
- std : 표준편차
- min : 최소값
- max : 최대값
- 25% , 50% , 75% : 4분위수 데이터 → 4분위수 데이터를 이용해서 이상치(이상한) 데이터 확인한다.

-  숫자값을 가지는 컬럼에 대해서만 확인

 

 

 

 

 

 

데이터 조회하기

 

 

### 국적코드 데이터 조회하기
sample_1['국적코드']

 

  이때의 데이터 타입은 Series

Series : 튜플과 모양()이 같다.(사용법도 동일함)
{"국적코드" : ( 데이터, 데이터,...)}

 

 

 

 

sample_1[["성별"]]

 

  이때의 데이터 타입은 DataFrame

sample_1[["국적코드","성별"]] 이런식으로 국적코드와 성별의 데이터만 조회할 수 있다.

 

 

 

 

 

 

 

 

 

컬럼 추가 하기

### 2019-11 값 추가하기
sample_1["기준년월"] = "2019-11"

데이터 필터링하기

### 성별 중에 여성인 데이터만 추출하기
condition = sample_1["성별"] == "여성"
sample_1[condition]

# 반대의 경우 남성 데이터만 추출하고자 할때 조건
sample_1[condition == False]

 

데이터 주소 전달/메모리 복제하기

sample_2 = sample_1

 

  객체 주소 전달 방식
둘다 같은 곳을 바라본다. 

하나가 변경되면 다른 하나도 변경됨

sample_2 = sample_1.copy()


  copy() : 메모리 복제방식(신규로 동일하게 생성됨)

하나가 변경되어도 다른 하나는 영향을 받지 않음

 

 

 

[ 실습 ]

 

 

공공데이터 포털 data.go.kr 의 < 한국전력거래소 시간별 전력수요량 > 데이터 사용

csv 파일로 다운로드 받아서 사용

 

### 데이터 불러들이기
# 데이터 프레임 변수명 : df
import pandas as pd
file_path = "./01_data/한국전력거래소_시간별 전력수요량_20211231.csv"
df = pd.read_csv(file_path , encoding = 'euc-kr')

 

  한글 읽기 위해 encoding 필요

이후 info() , describe() 통해 결측치와 이상치 확인 → 둘 다 없음

 

3개의 열(년도 , 시간 , 전력량) 을 가지는 데이터 프레임 생성하기

### 컬럼명의 시간을 데이터화하기
# - 컬럼명 추출하기
col_list = df.columns
col_list

 

result_df = pd.DataFrame(columns = ["년도","시간","전력량"])
result_df

 

 

 

 

### 데이터프레임에 데이터 행단위 추가하기
for index, row in df.iterrows():

    # 년도 데이터
    ymd = row[col_list[0]]
    
    # 시간과 전력량 데이터 
    data = row[col_list[1:]]
    
    # 시간과 전력량을 각각 추출하여 데이터프레임에 넣기
    # 넣을 값 : 날짜, 시간 , 전력량
    for time, value in data.items():
        # 행단위로 데이터 프레임에 추가하기 위해서 추가할 행을 데이터프레임 생성
        df_temp = pd.DataFrame({"년도":[ymd],"시간":[time],"전력량":[value]})
        
        # 데이터프레임에 행단위로 추가하기
        # - concat() : 데이터 프레임과 데이터프레임을 행단위(axis = 0) 또는 컬럼단위(axis = 1)로 추가할 때 사용
        #              ignoere_index = True : 행이 추가될 때 행 인덱스 번호를 자동 증가 시키기(default = false)
        result_df = pd.concat([result_df,df_temp], axis = 0 , ignore_index = True)
# 최종 결과 출력하기
result_df

왼쪽은  ymd / time / value 값, 오른쪽은 위 코드 실행시 생성된 result_df

 

정제된 데이터 파일로 저장하기

 

### 저장할 경로 지정
save_path = "./01_data/new_data.csv"
result_df.to_csv(save_path)

 

  저장해야 나중에 사용할때 용이함 

728x90