반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 런던
- 판다스
- 행렬
- 결정트리
- sql연습문제
- 코딩독학
- 코딩공부
- matplotlib
- 오늘도코드잇
- 로지스틱회귀
- 코딩
- HTML
- 선형회귀
- 파이썬
- 다항회귀
- 영국석사
- 데이터분석
- numpy
- SQL
- 코드잇 TIL
- 나혼자코딩
- Seaborn
- 코드잇
- CSS
- 윈도우함수
- 머신러닝
- 유학생
- 코드잇TIL
- 경사하강법
- for반복문
Archives
- Today
- Total
영국 척척석사 유학생 일기장👩🏻🎓
(파이썬) 판다스 데이터프레임에서 NaN값을 다루는 여러 가지 방법 본문
728x90
반응형
지난 글에서는 판다스 데이터프레임의 요소에 액세스 하고 행, 열을 추가하고 제거하는 방법에 대해 알아보았습니다. 이번 글에서는 여러 가지 방법으로 NaN 값을 다루는 방법에 대해 알아보겠습니다.
🔻(참고)데이터프레임 행,열 추가 및 제거🔻
- 우리는 대규모 데이터세트로 머신 러닝 알고리즘을 훈련시키기 전에 보통 먼저 데이터를 정리해야 합니다.
- 즉, 데이터에 있는 오류를 검출하고 시정할 방법이 필요하다는 의미입니다.
- 모든 데이터세트에는 이상치나 부정확한 값 같은 다양한 불량 데이터가 있을 수 있지만 거의 항상 누락값이라는 불량 데이터를 접하게 됩니다.
- Pandas는 누락된 데이터에 NaN이라는 값을 할당합니다.
- 이번 글에서는 NaN값을 검출하고 처리하는 방법에 대해 알아보겠습니다.
1. DataFrame 만들기
items2 = [{'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45},
{'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7},
{'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}]
store_items = pd.DataFrame(items2, index = ['store1', 'store2', 'store3'])
store_items
2. NaN 값의 개수 세기
- 위의 DataFrame에는 NaN값이 3개가 있습니다.
- 아주 큰 데이터세트를 DataFrame에 로딩하는 경우에는 NaN값의 개수는 쉽게 파악할 수 없습니다.
- 따라서 메소드들을 조합하여 데이터에 있는 NaN값의 개수를 셀 수 있습니다.
- .isnull() 메소드와 .sum() 메소드를 조합하여 NaN값의 개수를 세어 보겠습니다.
x = store_items.isnull().sum().sum()
print(x)
>>> 3
- 위의 예에서 .isnull() 메소드는 store_items와 같은 크기의 부울 값 DataFrame을 리턴하고, True를 사용하여 NaN값이 있는 요소를 표시하며 False를 사용하여 그렇지 않은 요소들을 표시합니다.
store_items.isnull()
- pandas 에서 논리 값 True는 숫자 값 1을 갖고, 논리 값 False는 숫자 값 0을 갖습니다.
- 그러므로 논리 값 True의 개수를 세어 NaN 값의 개수를 셀 수 있습니다.
- 논리 값 True의 총 개수를 세기 위해 .sum() 메소드를 두 번 사용합니다.
- 왜냐하면, 첫 번째 합계는 열에 따른 논리값 True의 합계가 담긴 pandas series를 리턴하기 때문입니다.
store_items.isnull().sum()
- 따라서 위 코드에 한번 더 .sum()을 하면 pandas series에 있는 1의 값들 합한 값이 됩니다.
3. NaN이 아닌 값의 총 개수 세기
- NaN 값의 개수를 세지 않고 반대로 NaN이 아닌 값의 개수를 셀 수도 있습니다.
- .count() 메소드를 쓰면 됩니다.
store_items.count()
4. NaN 값 제거하기
- 지금까지 데이터세트에 NaN 값이 있는지 확인하는 방법을 알아보았습니다.
- 이제 NaN값을 삭제하거나, 대체할 수 있습니다.
1) NaN 값이 있는 행 삭제하기
- .dropna(axis) 메소드를 사용하고 axis=0이라고 설정하면 NaN 값이 있는 모든 행이 삭제되고, axis=1로 설정하면 NaN 값이 있는 모든 열이 삭제됩니다.
store_items.dropna(axis=0)
2) NaN 값이 있는 열 삭제하기
store_items.dropna(axis=1)
- .dropna() 메소드는 NaN 값이 있는 행 또는 열을 제거하면 원본 DaraFrame은 변경되지 않습니다.
- dropna() 안에서 키워드 inplace = True 로 설정하면 그 원본의 열 또는 행을 삭제할 수 있습니다.
5. NaN 값 대체하기
- NaN 값을 제거하지 않고 그 값을 적절한 값으로 대체할 수 있습니다.
1) NaN을 0으로 대체하기
- .fillna() 메소드를 써서 NaN 값을 0으로 대체해보겠습니다.
store_items.fillna(0)
2) forward filling 하기
- .fillna() 메소드를 사용하여 NaN 값들을 DataFrame에 있는 이전 값들로도 대체할 수 있습니다.
- 이를 포워드 필링(forward filling) 이라고 합니다.
- 포워드 필링을 사용하여 NaN 값을 대체할 때 열 또는 행에서 가져온 이전 값을 사용할 수 있습니다.
- .fillna(method = 'ffill', axis) 으로 하면 포워드 필링(ffill) 메소드를 사용하여 주어진 axis를 따라 이전에 나온 값으로 NaN 값들을 대체하게 됩니다.
(1) NaN을 세로로(axis=0)으로 forward filling 하기
store_items.fillna(method = 'ffill', axis = 0)
- 여기서, store1의 NaN 값은 대체되지 않았습니다. NaN 값이 그 열의 첫 번째 값이기 때문입니다.
(2) NaN을 가로로(axis=1)으로 forward filling 하기
store_items.fillna(method = 'ffill', axis = 1)
3) backward filling 하기
- 이와 유사하게, NaN 값들을 DataFrame의 뒤에 있는 값들로 대체할 수 있습니다.
- 이를 백워드 필링(backward filling)이라고 부릅니다.
- .fillna(method = 'backfill', axis)는 백워드 필링(backfill) 메소드를 사용하여, 주어진 axis를 따라 뒤에 나온 값을 사용하여 NaN 값을 대체할 것입니다.
(1) NaN을 세로로(axis=0)으로 backward filling 하기
store_items.fillna(method = 'backfill', axis = 0)
- store3에 있는 NaN 값들은 그 열에서 마지막이기 때문에 NaN 값들이 대체되지 않았습니다.
(2) NaN을 가로로(axis=1)으로 backward filling 하기
store_items.fillna(method = 'backfill', axis = 1)
- 이러한 방법들로 NaN 값을 대체하면 원본 DataFrame 값들은 변경되지 않습니다.
- fillna() 함수 안에서 키워드 inplace = True로 설정하면 원본을 변경할 수 있습니다.
4) NaN 값들을 보간(추정) 하기
- 다양한 보간법을 이용하여 NaN 값들을 대체할 수 있습니다.
- 그 중 .interpolate(method = 'linear', axis) 메소드는 linear(선형) 보간법을 이용하여 주어진 axis를 따른 값들을 사용하여 NaN 값들을 대체할 것입니다.
(1) NaN을 세로로(axis=0)으로 보간(추정)하기
store_items.interpolate(method = 'linear', axis = 0)
(2) NaN을 가로로(axis=1)으로 보간(추정)하기
store_items.interpolate(method = 'linear', axis = 1)
728x90
반응형
'코딩공부 > Python' 카테고리의 다른 글
(파이썬) 판다스 데이터프레임(pandas dataframe) 행, 열 추가 및 제거 (0) | 2024.06.19 |
---|---|
(파이썬) Pandas DataFrame 판다스 데이터프레임 만들기 (0) | 2024.06.18 |
(파이썬) 판다스 시리즈(Pandas Series)에 대한 산술 연산 (0) | 2024.06.18 |
(파이썬) 판다스(Pandas) 시리즈 만들기, .loc/.iloc 이용해서 요소들에 액세스하고 삭제하기 (1) | 2024.06.18 |
(파이썬) 서브 패키지 (0) | 2024.06.18 |