import pandas as pd
import numpy as np

data = pd.DataFrame([[2, np.nan, 6, 8, 10],
                    [2, 4, np.nan, 8, np.nan],
                    [2, 4, 6, 8, 10],
                    [np.nan, 4, np.nan, 8, np.nan]]
                    ).transpose()

print(data)
data.columns = ['x1', 'x2', 'x3', 'x4']
print(data)

#      x1   x2    x3   x4
# 0   2.0  2.0   2.0  NaN
# 1   NaN  4.0   4.0  4.0
# 2   6.0  NaN   6.0  NaN
# 3   8.0  8.0   8.0  8.0
# 4  10.0  NaN  10.0  NaN

# 0. 결측치 확인
print(data.isnull())
print(data.isnull().sum())   #True가 결측치
print(data.info())   #info와 DESCR 활용하여 데이터 확인하는 습관을 기르자.

# dtype: int64
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 4 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   x1      4 non-null      float64
#  1   x2      3 non-null      float64
#  2   x3      5 non-null      float64
#  3   x4      2 non-null      float64
# dtypes: float64(4)
# memory usage: 288.0 bytes
# None

# 1. 결측치 삭제
print("===================== 결측치 삭제 ====================")
# print(data['x1'].dropna())   # 이렇게하면 그 열에서만 삭제되기 때문에 의미가 없다.
# print(data.dropna()) # 디폴트가 행 위주 삭제.
print(data.dropna(axis=0)) # 행 위주 삭제 / 디폴트
print(data.dropna(axis=1)) # 열 위주 삭제

#2-1. 특정값 - 평균
print("=================== 결측치 처리 mean() ================")
# data.mean()  #각 컬런별 평균을 뽑아줌
means = data.mean() 
print('평균 : ', means)
data2 = data.fillna(means)
print(data2)

#2-2. 특정값 - 중위값
print('=================== 결측치 처리 median() ==============')
median = data.median()
print('중위값 : ', median)
data3 = data.fillna(median)
print(data3)

#2-3. 특정값 - ffill, bfill
print('=================== 결측치 처리 ffill, bfill ==============')
data4 = data.fillna(method='ffill')
print(data4)    #앞의 값이 없는 경우 값을 가져올 수 없다.
data5 = data.fillna(method='bfill')
print(data5)    #뒤의 값이 없는 경우 값을 가져올 수 없다.

#2-4. 특정값 - 임의값으로 채우기
print('=================== 결측치 처리 - 임의의 값으로 채우기 ==============')
# data6 = data.fillna(777777)
data6 = data.fillna(value='777777')
print(data6)

##########################특정칼럼만##############################

#1. x1컬럼에 평균값
means = data['x1'].mean() #평균값 저장
data['x1'] = data['x1'].fillna(means) #means로 채우기
print('fill_na_x1_means :','\\n',data)

#2. x2컬럼에 중위값
medians = data['x2'].median() #중위값 저장
data['x2'] = data['x2'].fillna(medians) #medians로 채우기
print('fill_na_x2_median :','\\n',data)

#3. x4컬럼에 ffill한 후 / bfill
data = data.fillna(method='ffill') #ffill 적용
data = data.fillna(method='bfill') #bfill 적용
print('fill_na_x4_fbfill :','\\n',data)

#머신러닝은 다차원 y값(y가 두개 이상인것) 못뽑는다.