본문 바로가기

Back-End/데이터베이스

[DB] 데이터프레임 정리 - 행/열 합치기, 결측치, 중복값, 이상치 처리

~ 목차 ~

 

데이터프레임 행단위/열단위 합치기

 

행단위 합치기

 


import pandas as pd

### 임시 데이터 생성1
data = [["Dog", 3], ["Cat", 5], ["Tiger", 2]]
index = [0, 1, 2]
columns = ["동물", "나이"]

df_temp1 = pd.DataFrame(data,
                        index = index,
                        columns = columns)

### 임시 데이터 생성2
data = [["집", 0], ["초원", 0], ["초원", 1]]
index = [0, 1, 2]
columns = ["사는곳", "뿔의갯수"]

df_temp2 = pd.DataFrame(data,
                        index = index,
                        columns = columns)

### df_temp1과 df_temp2를 행단위로 합치기(행으로 추가)
df_temp3 = pd.concat([df_temp1, df_temp2], axis=0, ignore_index=True)
df_temp3

df_temp1, df_temp2
행 합치기

 

열단위 합치기

 - 열단위로 합칠 때는 행의 갯수가 동일해야함!

 

 < 방법 1 : 그냥 옆으로 합치기>


pd.concat([df_temp1, df_temp2], axis=1)

열단위 합치기 - concat()

 

< 방법 2 : 키값을 이용해서 합치는 방식 >


### 임시 데이터 생성
data1 = {"국적코드": [1001, 1002, 1003],
               "국가" : ["한국", "미국", "인도"]}
df_info1 = pd.DataFrame(data1)

data2 = {"국적코드": [1001, 1001, 1005],
               "인구" : [100, 200, 300]}
df_info2 = pd.DataFrame(data2)

df_info1, df_info2

### 국적코드가 같은 값들에 대해서 합치기
# 기준은 df_info1
pd.merge(left=df_info1,
         right=df_info2,
         how="inner",
         left_on="국적코드",
         right_on="국적코드")

### 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
# 기준은 df_info1
pd.merge(left=df_info1,
         right=df_info2,
         how="left",
         left_on="국적코드",
         right_on="국적코드")

### 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
# 기준은 df_info2
pd.merge(left=df_info1,
         right=df_info2,
         how="right",
         left_on="국적코드",
         right_on="국적코드")


df_info1,&nbsp;df_info2

 

how="inner", "left" , "right"

 

 


 

전처리 - 결측치

 

결측치 처리 

 


### bicycle.csv 파일 읽어들이기
df = pd.read_csv("./data/bicycle.csv", encoding = "EUC-KR")
df

bicycle.csv&nbsp;파일

 

 

결측치 확인


### 결측치 확인
df.info()

 

결측치 확인

 

 

결측치 데이터 확인


### 결측치 데이터 확인
# 결측 데이터 값은 True, 정상 데이터는 False
df.isnull()

 

isnull()

 


### 결측치 데이터 확인
# 결측 데이터 값은 False , 정상 데이터는 True

df.notnull()

 

notnull()

 

 

 

결측치 처리 방법

 

 1. 결측치가 있는 부분의 데이터를 사용할지/말지 결정 (고객에게 문의)
 2. 사용 안한다면 -> 컬럼과 행 중에 어느 부분을 제거할지 결정
 3. 사용한다면 -> 어떻게 대체할지 결정
     (대체 방법)
     3.1. 결측치가 있는 해당 컬럼의 평균으로 모두 대체
     3.2. 범주형 데이터인 경우에는 범주의 비율대비로 대체
     3.3. 숫자값인 경우 모두 0으로 대체
     3.4. 결측데이터가 속한 주변 컬럼들의 데이터 유형과 유사한 데이터들의 평균으로 대체
     3.5. 결측치가 있는 컬럼의 직전/직후 데이터의 평균으로 대체      
     숫자 데이터인 경우 3.1, 3.3, 3.5(요즘 추세)를 많이 사용
     범주 데이터인 경우 3.2 사용

 

 

결측데이터 현황 확인

 

 - sum(0) : 0의 의미는 각 열의 행단위를 의미함

 - isnull().sum(0) : 각 컬럼별로 행단위를 체크하여 결측치 갯수를 알려줌

 


# 컬럼별 결측 현황
df.isnull().sum(0)

isnull().sum(0)

 

 

 - sum(1) : 1의 의미는 각 행의 컬럼 단위를 의미함

 - isnull().sum(1): 각 행에서 그 한 줄에 결측치가 몇개 있는지 체크

 


# 컬럼별 결측 현황
df.isnull().sum(1)

 

isnull().sum(1)

 

 

결측데이터 삭제하기

 

<결측치가 있는 모든 행들 삭제하기>

 - dropna()  :  NaN 데이터 삭제하기

 - axis=0 : 데이터의 행(row) 방향

 


# 결측치가 있는 모든 행들 삭제하기
df_drop=df.dropna(axis=0)
df_drop.info()

 

 

결측치 행 삭제하기

 

 

< 결측치가 있는 모든 컬럼 삭제하기>

 - dropna()  :  NaN 데이터 삭제하기

 - axis=1 : 데이터의 열(column) 방향

 - 조심해야함!!!


# 결측치가 있는 모든 컬럼 삭제하기
df_drop_col = df.dropna(axis=1)
df_drop_col.info()

결측치 컬럼 삭제하기

 

 

 

결측데이터 값 넣기

 

< nan값에 0으로 모두 채워라 >

 - fillna() : nan값에 OO으로 모두 채워라

 


# Nan값 0으로 모두 채워라
df["이용거리"].fillna(0)

 

 

문자값도 넣을 수 있음 >

 - fillna() : nan값에 OO으로 모두 채워라

 


# Nan값 "missing"으로 모두 채워라
df["이용거리"].fillna("missing")

 

 

< nan값에 평균으로 모두 채워라 >

 - fillna() : nan값에 OO으로 모두 채워라

 


# Nan값 평균으로 모두 채워라
df["이용거리"].fillna(df["이용거리"].mean())

 

결측치 평균값 넣기

 


 

전처리 - 중복값

 

중복데이터 처리 방법

 1. 중복데이터가 있는 행의 위치 확인하기 ( True : 중복 O)

      - duplicated()

 

1-1. keep : 중복 중에 몇 번째 중복을 False(남겨 둘 것인지)로 할 것인지

      - keep : first, last, False

      - first : 첫번째만 False(뒤쪽 중복 데이터는 모두 True) → 기본값, 생략가능

        df.duplicated(["이용거리"], keep="first")
      - last : 마지막만 False(앞쪽 중복 데이터는 모두 True)

        df.duplicated(["이용거리"], keep="last")
      - False : 중복데이터 전체 True

        df.duplicated(["이용거리"], keep=False)

 

2. 중복데이터가 있는 행들만 추출하기

      - df[ df.duplicated() ]

 

3. 중복 데이터 사용할지 말지 결정

 

4. 중복 데이터 삭제

     - drop_duplicates()

 

 

 

중복데이터 찾기 

 


df["이용거리"]

### 중복데이터가 있는 행의 위치 확인하기 ( True : 중복 o)
df.duplicated(["이용거리"])

### 중복데이터가 있는 행들만 추출하기
df[df.duplicated(["이용거리"])]


### 중복 중에 첫번째는 False, 나머지 뒤에 중복들은 모두 True로
df.duplicated(["이용거리"], keep="first")

### 중복값 개수 구하기
df.duplicated(["이용거리"], keep="first").value_counts()

 

duplicated (["이용거리"])
중복값 개수 : 162

 

 

 

중복데이터 삭제 

- drop_duplicates() : 중복 데이터 삭제( Default값이 keep = "first" 라서 첫번째 값은 남기고 나머지 뒤에 중복값들이 삭제)

 


# True 162개가 삭제되고 False 258개만 조회됨
df.drop_duplicates(["이용거리"])

 

삭제된 후 조회

 

 


 

 

전처리 - 이상치

 

이상데이터 처리 순서

 1. 결측치 처리가 선행되어야 한다.
    - 결측치도 데이터로 인식되기 때문에


 2. 이상데이터에는 범주형, 숫자형 데이터 처리 방식이 다름
    - 일반적으로 이상데이터는 숫자형 데이터 처리를 주로 한다.


 3. 이상데이터 확인은 시각화(boxplot)를 통해서 확인 한다.

    - 주황색 선이 중앙값.
    - 위 아래 선 사이가 정상적인 값
    - 박스 위쪽 선 : Max Outliers
    - 박스 아래쪽 선 : Min Outliers
    - 이상치로 의심되는 데이터 : Max 및 Min Outliers를 벗어난 데이터들


 4. 실제 처리는 계산에 의해 처리된다.

     - 최대 = q3 + (1.5 * IQR)
     - 최소 = q1 - (1.5 * IQR)
     - IQR = q3-q1

 

 

 

결측치, 중복값 처리 

 


### 시각화 라이브러리
import matplotlib.pyplot as plt


### 사용할 데이터 읽어 들이기
df = pd.read_csv("./data/bicycle_out.csv", encoding = "euc-kr")
df

### 결측치 찾기
df.info()

### 결측치 처리하기 - 평균으로 채우기
df["대여거치대"] = df["대여거치대"].fillna(int(df["대여거치대"].mean()))
df["반납거치대"] = df["반납거치대"].fillna(int(df["반납거치대"].mean()))
df["이용시간"] = df["이용시간"].fillna(int(df["이용시간"].mean()))
df["이용거리"] = df["이용거리"].fillna(int(df["이용거리"].mean()))

df.info()

### 행단위 중복 체크하기 (True 개수가 없으면 중복데이터 없다는 뜻)
df.duplicated().value_counts()

※ 유니코드 error 발생시 : encoding = "euc-kr" 또는 "utf-8"

 

bicycle_out.csv

 

결측데이터 발견 후 처리

 

중복값 확인

 

 

이상데이터 확인하기

 


### 이상치 확인하기
df.describe()

※ 나이의 max값이 말이 안되는 값이 들어가있다.

 

이상데이터 확인

 

이상데이터 시각화

 - 나이 데이터를 기준으로 이상데이터 시각적으로 확인하기
 - 박스플롯(boxplot)을 이용
 - 위 아래 선 사이가 정상적인 값
 - 이상치로 의심되는 데이터 : Max 및 Min Outliers를 벗어난 데이터들
 


### 나이 데이터를 기준으로 이상데이터 시각적으로 확인하기
plt.boxplot(df["나이"])
plt.show()

boxplot()

 

 


### 100살 이상 데이터 확인하기
(df["나이"] >= 100).value_counts()

※ 100살 이상이 4명 있다.

100살 이상 데이터 확인

 

이상치 계산 방법

이상치 계산공식

 - 최대 = q3 + (1.5 * IQR)
 - 최소 = q1 - (1.5 * IQR)
 - IQR = q3-q1

 


### 넘파이 라이브러리 사용
import numpy as np

### 25% 및 75% 시점의 값 추출하기
q1, q3 = np.percentile(df["나이"], [25, 75])
q1, q3

### IQR 계산
iqr = q3 - q1
iqr

# max outliers 계산
upper_bound = q3 + (1.5*iqr)

# min outliers 계산
lower_bound = q1 - (1.5*iqr)

upper_bound, lower_bound

※ q1 = 24 // q3 = 40 // iqr = 16

q1, q3

 

IQR

 

Max 및 Min Outliers

 

 

max 또는 min을 벗어나는 데이터 추출하기

 - 나이의 이상치 범위 0살 ~ 64살
 - 이상치로 의심되는 max 또는 min을 벗어나는 데이터 추출하기

 


df [( (df["나이"] > upper_bound) | (df["나이"] < lower_bound) )]

※ 64초과이거나 0미만인 df데이터 추출

이상치 계산된 데이터 확인

※ 여기서 69살까지는 이상치라 보기 애매하다. 100이상인 경우만 처리하면 될것 같다.

 

 

728x90