缺失值类型
这里说两种缺失值类型:None 和 NaN
None:Python 内置类型。
number = None # Python 内置关键字
type(number) # 单独成类 NoneType,可以自己试一试
NaN:Numpy 采用的缺失值处理类型,是 np.nan 的类型。
number = np.nan # Numpy 默认缺失值类型,无论你用 Numpy 还是 Pandas 默认的都是它
type(number) # float类,浮点数
其实就是给打了个标签,让计算机认为这是浮点数。
我们知道 Numpy 依赖 C 实现快速计算,打了标签之后计算机就不会为了一个缺失值单独做处理,数组可以直接编译成C做快速运算。
实际上, None 没有用,因为在 Pandas 里会被自动转换成 NaN
处理方法
处理方法主要有四个:
isnull: is null
notnull:not null
dropna:去除有缺失值的行(默认)
fillna:填充缺失值
前两个是null,后两个是na
import pandas as pd
import numpy as np
from faker import Faker
faker = Faker()
area = pd.Series(np.random.randint(10000,size=6), index=[faker.city() for _ in range(6)])
population = pd.Series(np.random.randint(200000,size=6), index=area.index)
print(f'area:\n{area}\n')
print(f'population:\n{population}\n')
state = pd.DataFrame({'area':area, 'population':population})
print(f'state:\n{state}\n')
"""
area:
West Allison 7132
Port Brandon 2724
Bellton 2150
Natalieview 9620
Port Edgarstad 9834
Lake Barryport 168
dtype: int32
population:
West Allison 22996
Port Brandon 27225
Bellton 187925
Natalieview 58336
Port Edgarstad 173837
Lake Barryport 153202
dtype: int32
state:
area population
West Allison 7132 22996
Port Brandon 2724 27225
Bellton 2150 187925
Natalieview 9620 58336
Port Edgarstad 9834 173837
Lake Barryport 168 153202
"""
这里我们自己做一组数据出来。数据是随机的,大家自己选也行。
state_copy = state.copy()
state_copy.iloc[1,1]=None
print(f'state_copy:\n{state_copy}')
print(f'null:\n{state_copy.dropna()}\n')
print(f"""fill:\n{state_copy.fillna(method='ffill')}\n""")
"""
state_copy:
area population
West Allison 7132 22996.0
Port Brandon 2724 NaN
Bellton 2150 187925.0
Natalieview 9620 58336.0
Port Edgarstad 9834 173837.0
Lake Barryport 168 153202.0
null:
area population
West Allison 7132 22996.0
Bellton 2150 187925.0
Natalieview 9620 58336.0
Port Edgarstad 9834 173837.0
Lake Barryport 168 153202.0
fill:
area population
West Allison 7132 22996.0
Port Brandon 2724 22996.0
Bellton 2150 187925.0
Natalieview 9620 58336.0
Port Edgarstad 9834 173837.0
Lake Barryport 168 153202.0
"""
事实证明,None 这个类型在 pandas 里真的没有用。
关于 fillna 的方法:
method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None
Method to use for filling holes in reindexed Series
pad / ffill: propagate last valid observation forward to next valid
backfill / bfill: use next valid observation to fill gap.
默认用 None 填充(用 None 填充 None ?)
pad/ffill:取前一个
backfill / bfill:取后一个
具体是延行方向取还是列方向取取决于 axis