Pandas 데이터 처리 누락 값
6264 단어 파이썬 데이터 과학 브로셔
파이썬 데이터 과학 수첩 독서 노트
3.5 처리 누락값
은 실제 데이터 처리 과정에서 부족한 값과 이상 값이 가장 흔히 볼 수 있는 것으로 깨끗하고 가지런하며 직접 사용할 수 있는 데이터가 드물다.그래서 데이터 세척이 필요합니다.
3.5.1 부족한 값을 처리하는 방법 선택
DataFrame에는 누락된 값을 인식하는 여러 가지 방법이 있습니다.일반적으로 두 가지로 나뉜다.
마스크 방법에서 마스크는 원수 그룹의 차원과 같은 완전한 볼 형식의 수조일 수도 있고 비트(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는 데이터 구조에서 누락된 값을 검색, 제거, 교체하는 몇 가지 방법을 제공합니다. 주로 다음과 같은 몇 가지를 포함합니다.
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
주의해야 할 것은, 만약 이동한 후에 채울 때 채워야 할 부족한 값 앞에 값이 없다면, 그것은 여전히 부족한 값이다.