[Python] νμ΄μ¬ νλ€μ€(Pandas) - NaN λΉμ΄ μλ λ°μ΄ν° λ€λ£¨λ λ°©λ²
NaNμ΄λ?
NaNμ "Not a Number"μ μ½μλ‘, κ²°μΈ‘μΉ(missing value)λ₯Ό λνλ΄λ λ° μ¬μ©λλ νΉμν κ°μ΄λ€. μ£Όλ‘ νμ΄μ¬μ νλ€μ€μ κ°μ λ°μ΄ν° λΆμ λꡬμμ μ¬μ©λλ€.
NaNμ λ°μ΄ν°μ
μμ κ°μ΄ μ‘΄μ¬νμ§ μκ±°λ μνμ μΌλ‘ μ μν μ μλ μνλ₯Ό λνλΈλ€. μ΄κ²μ λ°μ΄ν°μ λΆμ¬, λλ½, λλ νΉμ μ°μ° κ²°κ³Όκ° μ μλμ§ μλ κ²½μ°μ ν΄λΉνλ€.
λ¨Όμ λ°μ΄ν°νλ μμ ν΅ν΄ NaN λ°μ΄ν°λ₯Ό μμ보μ.
>> 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}]
>> df=pd.DataFrame(data= items2, index= ['store 1','store 2','store 3'])
>> df
NaNλ₯Ό νμ νλ λ°©λ²
isna() λ©μλλ₯Ό μ¬μ©νλ©΄ NaN μ΄ ν΄λΉλ μ μ trueλ‘ λνλΈλ€.
>> #λ³μλͺ
.isna
>> df.isna()
κ±°κΎΈλ‘ μκ³ μΆλ€λ©΄ notna() λ©μλλ₯Ό μ¬μ©νλ€.
true(κ°μ΄ μλ κ², NaNμ΄ μλ κ²), false(κ°μ΄ NaNμΈ κ²)
>> df.notna()
κ·Έλ¦¬κ³ μ»¬λΌλ³λ‘ NaN μ κ°μλ₯Ό μκ³ μΆλ€λ©΄ sum() λ©μλλ₯Ό μΆκ°νμ¬ μ€ννλ€.
>> df.isna().sum()
bikes 0
pants 0
watches 0
shirts 1
shoes 0
suits 1
glasses 1
dtype: int64
μ 체 λ°μ΄ν°μμ NaN μ κ°μλ₯Ό μκ³ μΆλ€λ©΄ sum() λ©μλλ₯Ό νλ² λ μΆκ°νλ€.
>> df.isna().sum().sum()
3
NaNλ₯Ό μ²λ¦¬νλ λ°©λ²
1. NaNλ₯Ό μμ νλ λ°©λ²
λΉμ΄μλ λ°μ΄ν°λ₯Ό μ°Ύμλ΄μ΄ κ·Έ νμ μμ νλ€.(λ³΄ν΅ μ΄μ μμ νλ€κΈ° λ³΄λ¨ νμ μμ νκΈ° λλ¬Έμ)
>> df.dropna()
2. νΉμ κ°μΌλ‘ μ±μ°λ λ°©λ²
NaN λ°μ΄ν°κ° ν¬ν¨λ νμ μμ ν μ μλ€λ©΄ μ±μ°λ λ°©λ²μ μ¬μ©ν΄μΌνλ€.
NaNλ₯Ό μ«μλ₯Ό 0μΌλ‘ μ±μ°κΈ°
fillna() ν¨μλ₯Ό μ¬μ©νλ©΄ NaN λ°μ΄ν°λ₯Ό 0μΌλ‘ μ±μ NaNλ₯Ό μμ¨ μ μλ€.
>> df.fillna(0)
NaNλ₯Ό λ¬Έμ 'λ°μ΄ν° μμ'μΌλ‘ μ±μ°κΈ°
0 λμ λ¬Έμμ΄ λ°μ΄ν°λ₯Ό λ£μ΄μ μνλ λ¬Έμμ΄λ‘ λ체ν μ μλ€.
>> df.fillna('λ°μ΄ν° μμ')
νΉμ NaN λ°μ΄ν°λ§ λ³κ²½νκΈ°
λ§μ½ shirts 컬λΌμ NaNλ§ λ³κ²½νκ³ μΆλ€λ©΄
shirts 컬λΌλ§ μ§μ νμ¬ NaN λ°μ΄ν°λ₯Ό λ³κ²½ν μ μλ€.
>> df['shirts'].fillna('No data')
store 1 15.0
store 2 2.0
store 3 No data
Name: shirts, dtype: object
μμ΄λ λ€μ λ°μ΄ν°λ₯Ό μ΄μ©νμ¬ μ±μ°κΈ°
μμ νμ λ°μ΄ν°λ‘ μ±μ°λ λ°©λ²μ fillna λ©μλμ ffillμμ±μ μ¬μ©νκ³ (μμ fλ forward)
λ€μ νμ λ°μ΄ν°λ‘ μ±μ°λ λ°©λ²μ bfillμμ±μ μ¬μ©νλ€. (bλ back)
axis μμ±μ κ°μ λ°λΌ νμ΄ λ°©ν₯μ μ§μ ν μ μλ€.
axis=0: μ΄ λ°©ν₯μΌλ‘ μλ
axis=1: ν λ°©ν₯μΌλ‘ μλ
>> df.fillna(method= 'ffill', axis=0)
κ° μ»¬λΌλ³ νκ· κ°, μ΅μκ°, μ΅λκ°μΌλ‘ μ±μ°κΈ°
mean() λ©μλλ νλ€μ€μμ Seriesλ DataFrameμ νκ· μ κ³μ°νλ λ° μ¬μ©λλ€. μ΄ λ©μλλ μ£Όμ΄μ§ μΆμ λ°λΌ νκ· μ κ³μ°νλ€.
>> df.mean()
bikes 18.333333
pants 21.666667
watches 26.666667
shirts 8.500000
shoes 7.666667
suits 26.000000
glasses 27.000000
dtype: float64
>> df.fillna(df.mean()) # νκ· κ΅¬νλ€μμ Nan κ° μλμΌλ‘ λ€μ΄κ°
>> df.fillna(df.max()) #μ΅λκ°μΌλ‘ μ±μ°κΈ°
>> df.fillna(df.min()) #μ΅μκ°μΌλ‘ μ±μ°κΈ°