티스토리 뷰
R에서의 NA는 '잘못된 값', Null은 '아직 정해지지 않은 값'으로, 서로 다른 의미를 가지고 있었습니다.
파이썬에서는 R과 다르게 NaN(NA)와 Null 을 '정해지지 않은 값' 의 의미로 같이 사용합니다.
그렇기 때문에 NaN으로 Na와 Null을 모두 표현합니다.
# NA 사용 방법
from pandas import Series, DataFrame
Series([1,2,3,np.nan])
0 1.0
1 2.0
2 3.0
3 NaN
dtype: float64 # NaN 값 때문에 데이터 타입이 float
from numpy import nan as NA # np.nan 사용이 번거로울 경우 alias 사용
Series([1,2,3,NA])
0 1.0
1 2.0
2 3.0
3 NaN
dtype: float64
# NA 검사
s1 = Series([1,2,3,NA])
s1.isnull() == pd.isnull(s1)
0 False
1 False
2 False
3 True
dtype: bool
s1.isnull().sum() # null의 개수 확인
1
s1.isnull().all() # 데이터가 모두 null 인지 검사
False
s1.isnull().any() # null 이 하나라도 있는지 검사
True
# NA 치환
df1.fillna?
df1.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
# inplace 옵션 = 원본 데이터를 수정할 것인지 여부
1. fillna 메서드를 활용한 치환
df1 = DataFrame({'a':[1,2,3,NA,5],
'b':['a','b','c',NA,'e'],
'c':[100,NA,500,NA,300]})
df1
a b c
0 1.0 a 100.0
1 2.0 b NaN
2 3.0 c 500.0
3 NaN NaN NaN
4 5.0 e 300.0
df1.fillna(0) # 모든 Na 값을 0 으로 치환
a b c
0 1.0 a 100.0
1 2.0 b 0.0
2 3.0 c 500.0
3 0.0 0 0.0
4 5.0 e 300.0
df1.fillna({'a':'a', 'b':'b', 'c':'c'}) # Na를 각 컬럼별 치환
df1.fillna(method = 'ffill') # 이전 행 데이터로 치환
a b c
0 1.0 a 100.0
1 2.0 b 100.0
2 3.0 c 500.0
3 3.0 c 500.0
4 5.0 e 300.0
df1.fillna(method = 'bfill') # 이후 행 데이터로 치환
a b c
0 1.0 a 100.0
1 2.0 b 500.0
2 3.0 c 500.0
3 5.0 e 300.0
4 5.0 e 300.0
2. isnull 메서드를 활용한 치환
s1 = Series([1,2,3,NA])
s1[s1.isnull()] = 0 # Na 값을 0으로 치환
s1.astype('int')
0 1
1 2
2 3
3 0
dtype: int32
# NA 포함 행 삭제
df3.dropna?
df3.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
df1 = DataFrame({'a':[1,2,3,NA,5],
'b':['a','b','c',NA,'e'],
'c':[100,NA,500,NA,300]})
df1
df1.dropna() # Na값을 하나라도 포함하는 행 삭제 (default : how='any', axis=0)
df1.dropna(how='all') # 행 전체가 Na인 행만 삭제
df1.dropna(thresh = 2) # Na가 아닌 값이 n개인 행 출력
# NA 연산
df1 = DataFrame({'a':[1,2,3,4], 'b':[5,6,NA,8]})
df1 + 1 # NA 연산 불가능
df1.sum(axis=0) # sum 연산 가능
a 10.0
b 19.0
dtype: float64
round(df1.mean(),2) # mean 연산 가능 (Na값 무시 : count X)
a 2.50
b 6.33
dtype: float64
round(df1.mean(skipna=False),2) # skipna = False 설정 시, Na를 연산에 포함
a 2.5
b NaN
dtype: float64
Pandas의 특징으로 산술 통계 메서드 사용 시 Na는 자동으로 무시되고 연산이 작동
(단, Numpy의 array구조는 불가능 => Na 값이 있다면 결과도 무조건 Na)
'Python > Process' 카테고리의 다른 글
[Python] profile 만들기 (import를 한 번에) (0) | 2019.02.07 |
---|---|
[Python] Pandas - Series (0) | 2019.02.07 |
[Python] Numpy 배열(수학, 통계 메서드) (2) | 2019.02.02 |
[Python] Numpy 배열(메서드, 함수) (0) | 2019.02.01 |
[Python] Numpy 배열(생성, 색인, 연산 ..) (0) | 2019.02.01 |