데이터프레임 없는 값 채우기
pandas에서는 NaN의 값을 갖는 데이터를 누락된 데이터라고 합니다. NaN값은 해당 인덱스 레이블에 값이 없음을 의미합니다.
아래와 같이 NaN값을 가지는 데이터프레임을 생성하고 NaN으로 처리된 없는 값을 채우는 방법을 확인 해봅니다.
df = pd.DataFrame(np.arange(0, 30).reshape(10,3), index = np.arange(0,10), columns=['a','b','c'])
df
a | b | c | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
3 | 9 | 10 | 11 |
4 | 12 | 13 | 14 |
5 | 15 | 16 | 17 |
6 | 18 | 19 | 20 |
7 | 21 | 22 | 23 |
8 | 24 | 25 | 26 |
9 | 27 | 28 | 29 |
df.loc[[0,7]] = np.NaN
df[(df > 10) & (df < 13)] = np.NaN
df.loc[9]['b'] = np.NaN
df
a | b | c | |
---|---|---|---|
0 | NaN | NaN | NaN |
1 | 3.0 | 4.0 | 5.0 |
2 | 6.0 | 7.0 | 8.0 |
3 | 9.0 | 10.0 | NaN |
4 | NaN | 13.0 | 14.0 |
5 | 15.0 | 16.0 | 17.0 |
6 | 18.0 | 19.0 | 20.0 |
7 | NaN | NaN | NaN |
8 | 24.0 | 25.0 | 26.0 |
9 | 27.0 | NaN | 29.0 |
생성한 df 데이터프레임에 NaN을 추가합니다.
- df.loc[[0,7]] = np.NaN
: loc[]을 이용하여 0,7 로우 위치에 NaN을 추가합니다. - df[(df > 10) & (df < 13)] = np.NaN
: 불리언 선택을 이용하여 데이터프레임의 값이 10보다 크고 13보다 작은 것을
NaN으로 변경합니다. - df.loc[9]['b'] = np.NaN
: 9의 값을 갖는 로우와 컬럼 'b'의 위치의 값을 NaN으로 변경합니다.
위의 1~3번 코드를 수행하면 위와 같이 NaN 값을 갖는 데이터프레임으로 변경된 것을
확인할 수 있습니다.
NaN값 찾기
데이터가 없는 NaN를 찾기 위해서는 isnull()을 사용합니다. isnull()을 사용하면 데이터프레임에서NaN으로 표시된 위치를 True로 표시한 데이터프레임을 반환합니다.
df.isnull()
a | b | c | |
---|---|---|---|
0 | True | True | True |
1 | False | False | False |
2 | False | False | False |
3 | False | False | True |
4 | True | False | False |
5 | False | False | False |
6 | False | False | False |
7 | True | True | True |
8 | False | False | False |
9 | False | True | False |
NaN값을 갖는 위치만 True값을 갖는 데이터프레임이 반환된 것을 확인할 수 있습니다.
.sum()을 이용하여 NaN값을 확인하면 'a','b','c' 컬럼에 각각 3개가 있는 것을 알 수 있습니다.
결측 데이터의 삭제
'b' 컬럼에서 NaN이 제거된 Series가 리턴되었습니다. 데이터프레임에 적용하면 아래와 같이 NaN이 제거된 데이터프레임이 반환됩니다. 데이터 프레임에 .dropna()가 사용되면 NaN값이 하나 이상 있는 모은 로우가 삭제됩니다.
df.dropna()
a | b | c | |
---|---|---|---|
1 | 3.0 | 4.0 | 5.0 |
2 | 6.0 | 7.0 | 8.0 |
5 | 15.0 | 16.0 | 17.0 |
6 | 18.0 | 19.0 | 20.0 |
8 | 24.0 | 25.0 | 26.0 |
모든값이 NaN인 로우만 삭제하고 싶을 경우에는 how='all' 파라메터를 사용합니다.
df.dropna(how = 'all')
a | b | c | |
---|---|---|---|
1 | 3.0 | 4.0 | 5.0 |
2 | 6.0 | 7.0 | 8.0 |
3 | 9.0 | 10.0 | NaN |
4 | NaN | 13.0 | 14.0 |
5 | 15.0 | 16.0 | 17.0 |
6 | 18.0 | 19.0 | 20.0 |
8 | 24.0 | 25.0 | 26.0 |
9 | 27.0 | NaN | 29.0 |
how='all'을 사용하니 로우 3처럼 하나의 컬럼이 NaN값을 가진 로우가 삭제되지 않고 유지되었습니다. 따라서 결과로 출력되는 데이터프레임에도 NaN을 가진 로우가 있는 것을 확인할 수 있습니다.
df.dropna(how = 'all')
칼럼의 모든 값이 NaN인 경우에만 삭제를 원하는 경우에는 axis=1 또는 'columns'을 사용합니다. 테스트를 위해 NaN으로 채워진 'd' 컬럼을 추가합니다.
df['d'] = np.NaN
df
a | b | c | d | |
---|---|---|---|---|
1 | 3.0 | 4.0 | 5.0 | NaN |
2 | 6.0 | 7.0 | 8.0 | NaN |
3 | 9.0 | 10.0 | NaN | NaN |
4 | NaN | 13.0 | 14.0 | NaN |
5 | 15.0 | 16.0 | 17.0 | NaN |
6 | 18.0 | 19.0 | 20.0 | NaN |
8 | 24.0 | 25.0 | 26.0 | NaN |
9 | 27.0 | NaN | 29.0 | NaN |
df.dropna(how='all', axis='columns')
a | b | c | |
---|---|---|---|
1 | 3.0 | 4.0 | 5.0 |
2 | 6.0 | 7.0 | 8.0 |
3 | 9.0 | 10.0 | NaN |
4 | NaN | 13.0 | 14.0 |
5 | 15.0 | 16.0 | 17.0 |
6 | 18.0 | 19.0 | 20.0 |
8 | 24.0 | 25.0 | 26.0 |
9 | 27.0 | NaN | 29.0 |
'Programming > Pandas' 카테고리의 다른 글
[Pandas] 데이터 변경해서 새로운 컬럼생성 (MDD 컬럼) (0) | 2022.01.07 |
---|---|
[Pandas] 중복 데이터 제거하기 (0) | 2022.01.04 |
[Pandas] 데이터프레임 로우, 컬럼 정보 확인하기 (0) | 2022.01.02 |
[Pandas] 리인덱싱 (0) | 2022.01.01 |
[Pandas] 불리언 선택 (0) | 2021.12.31 |