Coding Diary.

(파이썬) 판다스 데이터프레임에서 NaN값을 다루는 여러 가지 방법 본문

Coding/Python

(파이썬) 판다스 데이터프레임에서 NaN값을 다루는 여러 가지 방법

life-of-nomad 2024. 6. 19. 11:47
728x90
반응형
지난 글에서는 판다스 데이터프레임의 요소에 액세스 하고 행, 열을 추가하고 제거하는 방법에 대해 알아보았습니다. 이번 글에서는 여러 가지 방법으로 NaN 값을 다루는 방법에 대해 알아보겠습니다.

 

🔻(참고)데이터프레임 행,열 추가 및 제거🔻

 

(파이썬) 판다스 데이터프레임(pandas dataframe) 행, 열 추가 및 제거

지난 글에서 판다스 데이터프레임을 직접 만드는 방법에 대해 알아보았습니다. 이번 글에서는 판다스 데이터프레임의 요소에 액세스 하고 행, 열을 추가하고 제거하는 방법에 대해 알아보겠습

life-of-nomad.tistory.com

  • 우리는 대규모 데이터세트로 머신 러닝 알고리즘을 훈련시키기 전에 보통 먼저 데이터를 정리해야 합니다.
  • 즉, 데이터에 있는 오류를 검출하고 시정할 방법이 필요하다는 의미입니다.
  • 모든 데이터세트에는 이상치나 부정확한 값 같은 다양한 불량 데이터가 있을 수 있지만 거의 항상 누락값이라는 불량 데이터를 접하게 됩니다.
  • 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
반응형