Pandas 데이터 처리 누락 값

파이썬 데이터 과학 수첩 독서 노트


3.5 처리 누락값


  은 실제 데이터 처리 과정에서 부족한 값과 이상 값이 가장 흔히 볼 수 있는 것으로 깨끗하고 가지런하며 직접 사용할 수 있는 데이터가 드물다.그래서 데이터 세척이 필요합니다.

3.5.1 부족한 값을 처리하는 방법 선택


  DataFrame에는 누락된 값을 인식하는 여러 가지 방법이 있습니다.일반적으로 두 가지로 나뉜다.
  • 단독 같은 크기의 마스크 df를 통해 부족한 값을 표시한다
  • 누락된 값
  • 을 NaN과 같은 레이블 값으로 나타냅니다.
      마스크 방법에서 마스크는 원수 그룹의 차원과 같은 완전한 볼 형식의 수조일 수도 있고 비트(0 또는 1)로 부족한 값을 표시할 수도 있다.그러나 단독 마스크 그룹을 사용하면 블라인드 형식의 그룹이 추가로 나타나 저장과 계산의 부담을 증가시킬 수 있다.
       탭 방법에서 탭 값은 구체적인 데이터(예를 들어 -9999는 부족한 값을 나타낸다)일 수도 있고 더 전체적인 값일 수도 있다. 예를 들어 NaN은 확실한 부동점수를 나타낸다.그러나 유효한 값으로 표시할 수 있는 범위를 줄였다.또한 NaN은 모든 데이터 유형을 나타낼 수 없습니다.

    3.5.2 Pandas의 부족값


      Pandas는 두 가지 Python의 원래 부족 값인 부동 데이터 형식의 NaN 값과 Python의 None 대상을 포함하는 탭 방법을 사용하여 부족 값을 표시합니다.

    1. None: Python 객체의 누락 값


      Pandas에서 사용할 수 있는 첫 번째 부족한 값 라벨은 None입니다. 그는 Python 단일 대상(object)으로 코드에서 부족한 값을 자주 나타냅니다.None은 Python 객체이므로 Numpy/Pandas 배열 유형의 누락된 값으로 사용할 수 없으며 Object 배열 유형(즉, Python 객체로 구성된 배열)에서만 사용할 수 있습니다.
    In [1]:import pandas as pd
    	   import numpy as np
    In [2]:v1 = np.array([1,None,3,4])
    	   v1 
    Out[2]:array([1, None, 3, 4], dtype=object)
    

    여기에서 dtype=object는 NumPy가 이 수조가 Python 대상으로 구성되어 있기 때문에 그 유형을 object로 판단한다고 표시합니다.이러한 유형은 특정 시나리오에서 매우 유용하며 데이터에 대한 모든 작업은 파이썬 차원에서 이루어지지만 일반적인 빠른 작업을 할 때 이러한 유형은 다른 원본 유형 수조보다 더 많은 자원을 소모한다.
    In [3]:for dtype in ['object', 'int']:
    	   print("dtype =", dtype)
    	   %timeit np.arange(1E6, dtype=dtype).sum()
           print()
           
    dtype= object
    93 ms ± 5.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    dtype= int
    3.89 ms ± 67.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    

      또한 누락된 값 레이블로 None을 사용할 때sum() 또는min()을 사용하면 일반적으로 유형 오류가 발생합니다.
    In [4]:v1.sum()
    
    TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
    

    2. NaN: 누락된 수치 유형의 값


    또 다른 부족한 값의 라벨은 Nan(Not a Number)으로 본질적으로 부동점수이다. 이것은 이전의 Object 유형의 그룹과 달리 그는 C 언어로 컴파일되어 빠르게 조작된다는 것을 의미한다(Numpy는 C 언어를 기반으로 하고 object는 Python을 기반으로 한다).Nan을 데이터 바이러스로 볼 수 있습니다. Nan은 그것과 접촉한 데이터를 동화시킬 것입니다.NaN과 어떤 작업을 수행하더라도 결과는 NaN입니다.
    In [5]: type(np.nan)
    Out[5]: float
    
    In [6]: 1 + np.nan
    Out[6]: nan
    
    In [7]: 0 * np.nan
    Out[7]: nan
    

       그러나 누적 작업을 할 때 이상이 나타나지 않지만 때로는 우리가 원하는 결과가 아니다.
    In [8]: v2 = np.array([1,np.nan,3,4])
    		v2
    Out[8]: array([ 1., nan,  3.,  4.])
    
    In [9]:	v2.sum(), v2.min(), v2.max()
    Out[9]: (nan, nan, nan)
    

      Numpy는 누락된 값의 영향을 무시할 수 있는 특수 누적 함수를 제공합니다.
    In [10]: np.nansum(v2) #      ,       
    Out[10]: 8.0
    

    3.5.3 누락값 처리


      Pandas는 데이터 구조에서 누락된 값을 검색, 제거, 교체하는 몇 가지 방법을 제공합니다. 주로 다음과 같은 몇 가지를 포함합니다.
  • isnull(): 볼 형식의 마스크 라벨 부족 값을 만듭니다.
  • notnull (): isnull () 작업과 반대입니다.
  • dropna(): 부족한 값을 제거한 데이터를 되돌려줍니다.
  • fillna(): 부족한 값을 채운 데이터 복사본을 되돌려줍니다.

  • 1. 부족값 발견


      Pandas 데이터 구조는 두 가지 효과적인 방법으로 부족한 값을 발견할 수 있습니다: isnull () 과 notnull ().각 메서드는 다음과 같은 부울 유형의 마스크 데이터를 반환합니다.
    In [11]: data = pd.Series([1, np.nan, 'hello', None])
    		 data
    Out[11]: 0        1
    		 1      NaN
    		 2    hello
    		 3     None
    		 dtype: object
    		 
    In [12]: a = data.isnull()
    		 a		 
    Out[12]: a    False
    		 b     True
    		 c    False
    		 d     True
    		 e    False
    		 dtype: bool
    #                
    In [13]: data[data.notnull()]
    Out[13]: 0        1
    		 2    hello
    		 dtype: object
    

    이 isnull() 및 notnull()는 DataFrame에서도 동일하게 적용됩니다.

    2. 부족값 제거


     앞에서 소개한 마스크 방법 외에 두 가지 유용한 결핍값 처리 방법이 있는데 그것이 바로dropna()(결핍값 제거)와fillna(결핍값 충전)이다.
    In [14]:data.dropna()
    Out[14]:0        1
    		2    hello
    		dtype: object
    

    DataFrame에서도 마찬가지로 사용되지만 변경이 필요합니다.
    In [15]:df = pd.DataFrame([[1, np.nan, 2],
    						   [2, 3, 5],
    						   [np.nan, 4, 6]])
    		df
    Out[15]:
    	0	1	2
    0	1.0	NaN	2
    1	2.0	3.0	5
    2	NaN	4.0	6
    
    In [16]:df.dropna()
    Out[16]:
    	0	1	2
    1	2.0	3.0	5
    

    DataFrame에서 dropna () 를 사용하여 매개 변수를 추가하지 않을 때, 부족한 값이 있는 전체 줄이나 열을 제거합니다.제어 매개 변수는 axis입니다. 기본적으로 부족한 값을 포함하는 모든 줄 데이터를 제거합니다. axis=0.열을 삭제하고 싶을 때, axis=1 (또는 axis='columns') 을 사용하십시오.
    In [17]:df.dropna(axis=1)
    Out[17]:
    		2
    	0	2
    	1	5
    	2	6
    

      그러나 이렇게 하면 비결실치를 함께 제거할 수 있다. 왜냐하면 때로는 모두 결실치인 줄이나 열만 제거하거나 절대 다수가 결실치인 줄이나 열만 제거할 수 있기 때문이다.이러한 수요는 how나thresh 파라미터를 설정해서 충족시킬 수 있으며, 줄이나 열의 부족한 값을 제거하는 수량 한도값을 설정할 수 있다.  기본 설정은 how='any'입니다. 즉, 부족한 값만 있으면 전체 줄이나 열을 제거합니다. (axis를 통해 좌표축을 설정합니다.)how='all'도 설정할 수 있습니다. 그러면 모든 값이 부족한 줄이나 열만 제거할 수 있습니다.
    In [18]:df[3] = np.nan
    		df
    Out[18]:
    	0	1	2	3
    0	1.0	NaN	2	NaN
    1	2.0	3.0	5	NaN
    2	NaN	4.0	6	NaN
    
    In [19]:df.dropna(axis='columns', how='all')
    Out[19]:
    	0	1	2
    0	1.0	NaN	2
    1	2.0	3.0	5
    2	NaN	4.0	6
    

      우리도 한도값thresh를 설정할 수 있습니다. 유효한 값이 어떤 수치보다 크면 이 줄이나 열을 삭제하지 않습니다.
    In [20]:df.dropna(axis='rows', thresh=3)
    Out[20]:
    	0	 1	  2    3
    1  2.0  3.0   5   NaN
    

    3. 부족값 채우기


     사실, 때때로 우리는 부족한 값을 제거하고 싶지 않다. 특히 데이터의 양이 시간에 비해 많을 때 그들을 효과적인 수치로 바꾸려고 한다.이 때 우리는fillna () 방법을 사용하면 부족한 값을 채운 수조 복사본을 되돌려줍니다.
    In [21]:data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
    		data
    Out[21]:
    a    1.0
    b    NaN
    c    2.0
    d    NaN
    e    3.0
    dtype: float64
    

      우리는 임의의 값을 사용하여 부족한 값을 채웁니다.
    In [22]:data.fillna(-99)
    Out[22]:
    a     1.0
    b   -99.0
    c     2.0
    d   -99.0
    e     3.0
    dtype: float64
    

      만약 우리가 부족한 값 앞의 유효한 값으로 채우려면method=ffill(forward-fill);  만약 우리가 부족한 값 뒤에 있는 유효한 값으로 채우려면method=bfill(back-fill)을 사용할 수 있습니다.
    In [23]:data.fillna(method="ffill")	#     
    Out[23]:
    a    1.0
    b    1.0
    c    2.0
    d    2.0
    e    3.0
    dtype: float64
    
    In [24]:data.fillna(method="bfill")	#     
    Out[24]:
    a    1.0
    b    2.0
    c    2.0
    d    3.0
    e    3.0
    dtype: float64
    

    Axis 매개변수를 추가하면 DataFrame도 마찬가지로 적용됩니다.
    In [25]:df.fillna(method='ffill', axis=1)	# axis=1,           
    Out[25]:
    	 0	 1	 2	 3
    0	1.0	1.0	2.0	2.0
    1	2.0	3.0	5.0	5.0
    2	NaN	4.0	6.0	6.0
    

       주의해야 할 것은, 만약 이동한 후에 채울 때 채워야 할 부족한 값 앞에 값이 없다면, 그것은 여전히 부족한 값이다.

    좋은 웹페이지 즐겨찾기