데이터를 확인할 때 결측치가 있는지 꼭 확인해주어야 한다.
결측치 관련 함수를 살펴보자.
간단한 데이터셋을 만들어준다.
import pandas as pd
import numpy as np
# create a DataFrame with missing values
df = pd.DataFrame({'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': [9, 10, 11, 12]})
1. 결측치 확인 : isna(), isnull()
두 함수의 기능은 동일하다.
결측치인 경우 True, 결측치가 아닌 경우 False를 반환해준다.
df.isnull() #df.isna()
참고) notnull()
위의 두 함수와는 반대로 결측치가 아닌 경우에 True, 결측치인 경우에 False를 반환해준다.
2. 결측치 개수 확인 : isnull().sum()
근데 위에 True, False만 확인해서는 큰 의미가 없다. 그래서 결측치 개수를 확인하기 위해서 sum()을 사용한다.
각 열마다 True값을 더해서 반환하기 때문에 결국 각 column마다 존재하는 결측치 개수를 반환한다.
df.isnull().sum()
3. 결측치 조회
간단하게 결측치가 존재하는 행을 확인하기 위해서는 아래와 같이 적용하면 된다.
다만 아래와 같이 적용하면 A열에서 결측치가 있는 경우만 출력된다.
df[df['A'].isnull()]
A와 B 둘 중 하나라도 결측치가 존재하는 경우를 출력하려면 or로 연결해주면 된다.
마찬가지로 만약 A와 B 모두 결측치가 존재하는 경우를 출력하고 싶다면 and로 연결해주면 될 것이다.
df[df['A'].isnull() | df['B'].isnull()]
다만 여기서 생긴 의문점은
만약 결측치가 5개 column 이상에서 발생하였고
결측치들을 한번에 조회하고 싶은데 위와 같이 하나씩 or로 연결해주는 것은 너무 비효율적이라는 생각이 들었다.
그래서 아래와 같이 간단한 함수를 하나 만들었다!!
def nan_show(df) :
nan_col = list(df.columns[df.isnull().sum()!=0]) #결측치가 존재하는 column 명 저장
if not nan_col : # 만약 결측치가 존재하지 않는다면 'No missing value' 반환
return 'No missing value'
ser = df[nan_col[0]].isnull() # 만약 결측치가 존재한다면 결측치가 존재하는 모든 행을 조회함
for i in range(1,len(nan_col)) :
ser |= df[nan_col[i]].isnull()
return pd.DataFrame(df[ser])
함수를 적용하면 아래와 같이 결측치가 존재하는 모든 행이 출력된다. index도 유지된다.
결측치가 5개 이상의 여러 행에 존재하는 경우에도 똑같이 적용됨을 확인하였다.👌
df_nan = nan_show(df)
df_nan
4. 결측치 제거 : dropna()
dropna()를 사용해서 결측치가 포함된 행/열을 간단하게 제거해줄 수 있다.
[Parameter]
- axis : 0이면 행에 대해서, 1이면 열에 대해서
- inplace : True면 원본에 저장
- how : 'any'면 하나라도 결측치일 때 모두 제거, 'all'이라면 모두 결측치여야 제거
- thresh : thresh = n 결측치가 아닌 값이 n개 미만일 때 제거
- subset : subset = [컬럼명] 해당 컬럼에 대해서만 결측치 여부 판단
df.dropna(inplace = True)
df
그 외에 제거하지 않고 결측치를 대체해주는 방법 역시 존재한다. 이건 다음 시간에..
'Basic > [Pytohn] Numpy, Pandas' 카테고리의 다른 글
[pandas] 데이터 타입 관련_dtypes, astype(), to_numeric (0) | 2023.03.16 |
---|---|
[pandas] 중복값 제거_duplicated() , drop_duplicates() (0) | 2023.03.16 |