데이터를 수집하다보면 다양한 결측치들이 포함되어 우리를 힘들게 할때가 많은데요.
이번 포스팅에서는 dropna를 통해 우리가 원하는 방식으로 결측값을 처리하는 방법에 대해 배워 보도록 하겠습니다.
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법](https://blog.kakaocdn.net/dn/cTLDJS/btq9HKWm6c9/iW4Y937zbetiFIsC72qvDk/img.png)
dropna 디폴트 세팅
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna()
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna 디폴트 세팅 [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna 디폴트 세팅](https://blog.kakaocdn.net/dn/boVFIA/btq9LrH25u5/0pJSPFKxKrmNcRMWpty4h1/img.png)
dropna 메소드에 어떤 인자도 넣지 않은 상태로 디폴트값을 실행시켰을때 위와 같은 결과가 나옵니다.
정확하게 말하면 디폴트 상태는 df.dropna(axis='index', how='any)입니다.
해당 인자의 의미는 인덱스방향(행)으로 하나씩 훑으면서 nan값이 하나라도 있으면 해당 행을 삭제시키겠다라는 의미입니다.
우리 코드에선 '현정이네', '문영이네'에 nan값이 있었기때문에 두 가게가 삭제되었습니다.
앞서 how='any'를 맛보았는데요, how='all'일때는 어떤 연산을 수행할까요?
df.dropna(how='all')
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna(how='all')
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all') [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all')](https://blog.kakaocdn.net/dn/cPa9nT/btq9Ns0O2ep/1kLqc0KzRS1btPrn3FRUY1/img.png)
변화가 없습니다. 왜냐하면 all이 의미하는것은 특정 행의 모든값이 다 Nan이어야지 삭제 하겠다는 의미이기 때문입니다.
all이 정말 작동하는지 확인하기 위해 아래와 같이 특정 행이 모든 Nan 값인 형태를 만들어 보았습니다.
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all') [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all')](https://blog.kakaocdn.net/dn/qDz03/btq9NRsv0NS/NEBY0aKs0AkrXup7kPnoCk/img.png)
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, np.nan, 1000, 200],
'배' : [1100, 800, np.nan, 500, 2000],
'딸기' : [800, np.nan,np.nan,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna(how='all')
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all') [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(how='all')](https://blog.kakaocdn.net/dn/QPpLY/btq9LpQ03C9/hIpeWFYQQCEzIpaGoxveDk/img.png)
output 결과를 보시면 모든 값이 Nan으로 채워져있던 문영이네가 삭제된것을 알 수 있습니다.
이어서 컬럼(열)을 기준으로 nan값이 있는지 확인하는 법을 알아보겠습니다.
기본적으로 디폴트 값이 axis='index'임으로 열을 기준으로 보기위에서는 명시적으로 기입을 해줘야 합니다.
df.dropna(axis = 'columns', how='any')
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(axis = 'columns', how='any') [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - df.dropna(axis = 'columns', how='any')](https://blog.kakaocdn.net/dn/bltbnG/btq9NQG82qM/ZoTRnyHi3CLIsnTAM4NdVk/img.png)
이번에는 axis ='columns'로 지정해주었기때문에 column 방향으로 하나씩 값을 훑으면서 nan값이 하나라도 있다면 삭제 하게 됩니다.
nan값이 각각 한개씩 있던 딸기와 포도가 삭제 된 걸 알 수있죠.
때로 특정 컬럼에만 nan이있는지 확인하고 있을 경우 삭제하고 싶을때가 있죠.
그럴때는 subset 이라는 argument를 이용하면 됩니다.
dropna(subset=['column'])
우선 딸기가 nan값인 과일가게를 삭제 시키고싶을땐 어떻게할까요?
(즉, 딸기가 아닌 다른 과일이 nan인 상황은 신경쓰지 않겠다는거죠.)
# axis = 1
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna(axis = 'index', how='any', subset=['딸기'])
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column']) [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column'])](https://blog.kakaocdn.net/dn/bEajmK/btq9MEf879M/T2fEb2WVlZhPpQNGRkO1Jk/img.png)
output을 보시면 알 수 있듯이 딸기가 nan값이던 '현정이네'는 삭제 되었지만 포도가 nan값인 문영이네는 그대로 있는걸 알 수있습니다.
위 코드에서 how = 'any'라고 작성했는데요 사실 컬럼 하나만 보겠다고할때는 'all'과 'any'의 의미가 없습니다.
어차피 all도 1개이기 때문이죠.
그렇다면 subset 2개인 경우를 볼까요?
dropna(subset=['column1', 'column2'])
# how ='all', subset=['column1','column2'])
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna(axis = 'index', how='all', subset=['딸기','포도'])
이번에는 how = 'all', subset에 두개의 컬럼을 지정했습니다. 즉 '딸기', '포도'가 동시에 nan값인 행만 삭제하라는 뜻이지요.
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column1', 'column2']) [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column1', 'column2'])](https://blog.kakaocdn.net/dn/bOrbOs/btq9IDCLdn1/TYZhC1yliCUo2ekg1xUNN1/img.png)
output 을 보시면 삭제된 행이 없습니다. 왜냐하면 nan값이 있긴 하지만 딸기 포도 둘다 Nan값을 만족하는 행은 없기 때문이죠.
그러면 'any'를 사용해볼까요?
# how ='any', subset=['column1','column2'])
import pandas as pd
import numpy as np
test_data = {'상호명' :['상호네', '현정이네', '문영이네', '동엽이네', '우제네'],
'사과' : [1000, 900, 800, 1000, 200],
'배' : [1100, 800, 700, 500, 2000],
'딸기' : [800, np.nan,700,500,1000],
'포도' : [1500, 900, np.nan, 800, 900]}
df = pd.DataFrame(test_data)
df.set_index('상호명', inplace=True)
df.dropna(axis = 'index', how='any', subset=['딸기','포도'])
output :
![[판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column1', 'column2']) [판다스 기초] dropna를 통해 결측치가 있는 행|열 제거 방법 - undefined - dropna(subset=['column1', 'column2'])](https://blog.kakaocdn.net/dn/zlTml/btq9Nuj3FLG/NBIbvwF6KpZYCLlnOtvfgk/img.png)
딸기, 포도 컬럼중 하나만 nan값이 있을 경우 삭제하면 되기 때문에(how= 'any')
nan값을 하나씩 가지고있던 행들이 모두 삭제된것을 알 수 있습니다.
'파이썬 > pandas' 카테고리의 다른 글
[판다스 기초] 특정 열(column) 삭제 하는 방법 (0) | 2022.08.23 |
---|---|
[판다스 기초] 인덱스(index) 시작 번호 지정 하는 법 (0) | 2022.08.23 |
[판다스] 엑셀(excel) sheet별 데이터 이어 붙이는 방법 (0) | 2022.08.22 |
[pandas 기초] 판다스 행 전체 출력(row 생략 없애기) (0) | 2022.04.07 |
pandas drop을 활용한 데이터프레임 열/행 삭제하는 방법 (2) | 2021.07.16 |
댓글
꼬예님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.