컴공생의 다이어리
[판다스, pandas] 결측값 확인 및 처리(제거, 채우기) - isnull(), dropna(), fillna() 본문
데이터 분석 & 머신러닝
[판다스, pandas] 결측값 확인 및 처리(제거, 채우기) - isnull(), dropna(), fillna()
컴공 K 2021. 7. 30. 00:01pandas 결측값 확인 및 처리
결측값은 탐색적 데이터 분석에서도, 그 후 더 나아가 머신 러닝 알고리즘을 통해 분석을 할 때에도 성능에 영향을 줄 수 있는 값이다. 결측값은 아예 제거를 해주거나, 특정 값으로 채워주거나 크게 두 가지 선택을 해주는 것이 좋다.
결측값 확인 - isnull(), isnull().sum()
결측값을 확인해보려면 isnull().sum()을 사용하는 것이 간편하다.
In [1]:
import pandas as pd
In [2]:
df = pd.DataFrame({"v1":[None,200,None,400], "v2":[None,200,100,250], "v3":[40,60,500,None]})
df
Out[2]:
v1 | v2 | v3 | |
---|---|---|---|
0 | NaN | NaN | 40.0 |
1 | 200.0 | 200.0 | 60.0 |
2 | NaN | 100.0 | 500.0 |
3 | 400.0 | 250.0 | NaN |
In [3]:
df.isnull()
Out[3]:
v1 | v2 | v3 | |
---|---|---|---|
0 | True | True | False |
1 | False | False | False |
2 | True | False | False |
3 | False | False | True |
In [4]:
df.isnull().sum()
Out[4]:
v1 2
v2 1
v3 1
dtype: int64
위의 예시를 보면 알겠지만 df.isnull()의 결과를 보면 그 값이 null값이라면 True를 null값이 아니라면 False를 출력한다. df.isnull().sum()은 각 컬럼별 결측치가 몇개 있는지 확인하기 편하다.
만일 v1컬럼의 값에서 null 값을 가진 행을 추출하려면 아래와 같이 코드를 작성하면 된다.
In [5]:
df[df.v1.isnull()]
Out[5]:
v1 | v2 | v3 | |
---|---|---|---|
0 | NaN | NaN | 40.0 |
2 | NaN | 100.0 | 500.0 |
결측값 있는 행, 열 제거 - dropna()
결측값 있는 행이나 열을 제거 하기 위해서는 dropna()를 사용하면 된다. dropna 함수의 axis인자의 값으로 0을 넣어주면 행을 제거해주고 열은 axis인자에 1을 넣어주면 된다.
- 결측값 있는 행 제거 : df.dropna() or df.dropna(axis=0)
- 결측값 있는 열 제거 : df.dropna(axis=1)
In [1]:
import pandas as pd
In [2]:
df = pd.DataFrame({"v1":[None,200,None,400], "v2":[None,200,100,250], "v3":[40,60,500,700]})
df
Out[2]:
v1 | v2 | v3 | |
---|---|---|---|
0 | NaN | NaN | 40 |
1 | 200.0 | 200.0 | 60 |
2 | NaN | 100.0 | 500 |
3 | 400.0 | 250.0 | 700 |
In [3]:
df.dropna(axis=0)
Out[3]:
v1 | v2 | v3 | |
---|---|---|---|
1 | 200.0 | 200.0 | 60 |
3 | 400.0 | 250.0 | 700 |
In [4]:
df.dropna(axis=1)
Out[4]:
v3 | |
---|---|
0 | 40 |
1 | 60 |
2 | 500 |
3 | 700 |
결측값 채우기 - fillna()
결측값을 채우기 위해서는 fillna()를 사용하면 된다. fillna() 안에 특정값을 넣어 그 값으로 채워줄 수도 있지만 method인자에 ffill이나 bfill을 넣어 결측값을 결측값 앞의 인자 혹은 뒤의 인자로 대체해서 채우는 방법도 있다.
- 결측값을 특정 값으로 채우기 : df.fillna(특정값)
- 결측값을 결측값의 앞 행의 값으로 채우기 : df.fillna(method='ffill') or df.fillna(method='pad')
- 결측값을 결측값의 뒷 행의 값으로 채우기 : df.fillna(method='bfill') or df.fillna(method='backfill')
- 결측값을 각 열의 평균 값으로 채우기 : df.fillna(df.mean())
In [1]:
import pandas as pd
In [2]:
df = pd.DataFrame({"v1":[None,200,None,400], "v2":[None,200,100,250], "v3":[40,60,500,700]})
df
Out[2]:
v1 | v2 | v3 | |
---|---|---|---|
0 | NaN | NaN | 40 |
1 | 200.0 | 200.0 | 60 |
2 | NaN | 100.0 | 500 |
3 | 400.0 | 250.0 | 700 |
In [3]:
df.fillna(0)
Out[3]:
v1 | v2 | v3 | |
---|---|---|---|
0 | 0.0 | 0.0 | 40 |
1 | 200.0 | 200.0 | 60 |
2 | 0.0 | 100.0 | 500 |
3 | 400.0 | 250.0 | 700 |
In [4]:
df.fillna(method='ffill') # 뒷 행의 값으로 결측치 채우기
Out[4]:
v1 | v2 | v3 | |
---|---|---|---|
0 | NaN | NaN | 40 |
1 | 200.0 | 200.0 | 60 |
2 | 200.0 | 100.0 | 500 |
3 | 400.0 | 250.0 | 700 |
In [5]:
df.fillna(method='bfill') # 앞 행의 값으로 결측치 채우기
Out[5]:
v1 | v2 | v3 | |
---|---|---|---|
0 | 200.0 | 200.0 | 40 |
1 | 200.0 | 200.0 | 60 |
2 | 400.0 | 100.0 | 500 |
3 | 400.0 | 250.0 | 700 |
In [6]:
df.fillna(df.mean()) # 각 열의 평균 값으로 결측치 채우기
Out[6]:
v1 | v2 | v3 | |
---|---|---|---|
0 | 300.0 | 183.333333 | 40 |
1 | 200.0 | 200.000000 | 60 |
2 | 300.0 | 100.000000 | 500 |
3 | 400.0 | 250.000000 | 700 |
https://rfriend.tistory.com/262
https://rfriend.tistory.com/263
출처 : 핀테크 Pre-인턴십 코스 - 금융 데이터 분석
728x90
'데이터 분석 & 머신러닝' 카테고리의 다른 글
[판다스, pandas] dataframe 특정 조건에 맞는 데이터 추출 (0) | 2021.10.06 |
---|---|
[판다스, pandas] dataframe의 특정 열에 함수 적용 - apply() (0) | 2021.10.02 |
[seaborn] heatmap과 pairplot으로 상관계수 시각화 (0) | 2021.07.29 |
[판다스, pandas] 데이터 프레임의 특정 컬럼(column) 접근, 여러 컬럼에 접근 (0) | 2021.07.28 |
[판다스, pandas] 데이터프레임의 값(df.values), 열(컬럼) 이름(df.columns), 리스트로 만들기(tolist()) (0) | 2021.07.28 |
Comments