06-04. 결측값 변경 (fillna / backfill / bfill / pad / ffill)
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
DataFrame.backfill( ) / DataFrame.bfill : DataFrame.fillna(mathod='bfill')과 동일합니다.
DataFrame.pad / DataFrame.ffill : DataFrame.fillna(method='ffill')과 동일합니다.
개요
fillna 메서드는 DataFrame에서 결측값을 원하는 값으로 변경하는 메서드입니다.
사용법
기본 사용법
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
value : 결측값을 대체할 값입니다. dict형태로도 가능합니다.
method : 결측값을 변경할 방식입니다. bfill로 할경우 결측값을 바로 아래 값과 동일하게 변경합니다.
ffill로 할 경우 결측값을 바로 위 값과 동일하게 변경합니다.
axis : {0 : index / 1 : columns} fillna 메서드를 적용할 레이블입니다.
inplace : 원본을 변경할지 여부입니다. True일 경우 원본을 변경하게 됩니다.
limit : 결측값을 변경할 횟수입니다. 위에서부터 limit로 지정된 갯수만큼만 변경합니다.
downcast : 다운캐스트할지 여부입니다. downcast='infer'일 경우 float64를 int64로 변경합니다.
예시
먼저 다양한 결측값이 포함된 간단한 5x5짜리 데이터를 만들어보겠습니다.
col = ['col1','col2','col3','col4','col5']
row = ['row1','row2','row3','row4','row5']
na = np.nan
data = [[na, 2,na, 4,na],
[ 6, 7,na, 9,na],
[11,na,na,14,15],
[na,17,na,na,20],
[na,22,na,na,25]]
df = pd.DataFrame(data,row,col)
print(df)
>>
col1 col2 col3 col4 col5
row1 NaN 2.0 NaN 4.0 NaN
row2 6.0 7.0 NaN 9.0 NaN
row3 11.0 NaN NaN 14.0 15.0
row4 NaN 17.0 NaN NaN 20.0
row5 NaN 22.0 NaN NaN 25.0
value의 형식에 따른 사용
value가 숫자나 문자일 경우 그대로 결측값을 대체하게 됩니다. 여기서는 A로 바꿔보겠습니다.
print(df.fillna('A'))
>>
col1 col2 col3 col4 col5
row1 A 2.0 A 4.0 A
row2 6.0 7.0 A 9.0 A
row3 11.0 A A 14.0 15.0
row4 A 17.0 A A 20.0
row5 A 22.0 A A 25.0
dict형태로 입력할 경우 각각 레이블값에 대해 원하는 값으로의 변경이 가능합니다.
dict = {'col1':'A','col2':'B','col3':'C','col4':'D','col5':'E'}
print(df.fillna(value=dict))
>>
col1 col2 col3 col4 col5
row1 A 2.0 C 4.0 E
row2 6.0 7.0 C 9.0 E
row3 11.0 B C 14.0 15.0
row4 A 17.0 C D 20.0
row5 A 22.0 C D 25.0
method인수를 사용하는 경우
method인수에 bfill을 입력할 경우 결측값이 바로 아래값과 동일하게 설정됩니다.
※ df.backfill( )이나 df.bfill( )과 완전히 동일한 기능을 수행합니다.
print(df.fillna(method='bfill'))
>>
col1 col2 col3 col4 col5
row1 6.0 2.0 NaN 4.0 15.0
row2 6.0 7.0 NaN 9.0 15.0
row3 11.0 17.0 NaN 14.0 15.0
row4 NaN 17.0 NaN NaN 20.0
row5 NaN 22.0 NaN NaN 25.0
method인수에 ffill을 입력할 경우 결측값이 바로 위값과 동일하게 설정됩니다.
※ df.pad( )나 df.ffill( )과 완전히 동일한 기능을 수행합니다.
print(df.fillna(method='ffill'))
>>
col1 col2 col3 col4 col5
row1 NaN 2.0 NaN 4.0 NaN
row2 6.0 7.0 NaN 9.0 NaN
row3 11.0 7.0 NaN 14.0 15.0
row4 11.0 17.0 NaN 14.0 20.0
row5 11.0 22.0 NaN 14.0 25.0
limit인수를 사용하는 경우
limit인수는 각 레이블값에 대해서 결측치 변경을 수행할 횟수입니다. 행 기준일경우 왼쪽부터, 열 기준일 경우 위에서부터 수행합니다.
print(df.fillna('A', limit=2))
>>
col1 col2 col3 col4 col5
row1 A 2.0 A 4.0 A
row2 6.0 7.0 A 9.0 A
row3 11.0 A NaN 14.0 15.0
row4 A 17.0 NaN A 20.0
row5 NaN 22.0 NaN A 25.0
downcast인수를 사용하는 경우
downcast 인수를 'infer'로 설정함으로써 float64형태를 int64형태로 변경할 수 있습니다.
print(df.fillna(0, downcast='infer'))
>>
col1 col2 col3 col4 col5
row1 0 2 0 4 0
row2 6 7 0 9 0
row3 11 0 0 14 15
row4 0 17 0 0 20
row5 0 22 0 0 25
inplace를 사용하는 경우
다른 파이썬 객체에서와 마찬가지로 inplace는 원본을 덮어씌우는 기능과 유사한 기능알 합니다.
즉 df.fillna(0, inplace=True) 는 df=df.fillna(0)과 동일한 기능을 합니다.
df.fillna('A',inplace=True)
print(df)
>>
col1 col2 col3 col4 col5
row1 A 2.0 A 4.0 A
row2 6.0 7.0 A 9.0 A
row3 11.0 A A 14.0 15.0
row4 A 17.0 A A 20.0
row5 A 22.0 A A 25.0
'파이썬완전정복-Pandas DataFrame > 06. 결측제어' 카테고리의 다른 글
Pandas DataFrame 06-05. 결측값 없는 마지막 행 반환 (asof) (0) | 2022.01.22 |
---|---|
Pandas DataFrame 06-03. 결측값 없는 인덱스 확인 (first_valid_index / last_valid_index) (0) | 2022.01.22 |
Pandas DataFrame 06-02. 결측값 제거 (dropna) (0) | 2022.01.22 |
Pandas DataFrame 06-01. 결측값 확인 (isna, isnull, notna, notnull) (0) | 2022.01.22 |