一、Python中缺失值分类
Python中有三种缺失值(空值):
形式 | 含义 |
---|---|
None | Python内置的None值,如创建一个空的列表list=[] |
NA | 在pandas中,将缺失值表示为NA,表示不可用not available,主要表示为np.nan |
NaN | 对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据 |
二、缺失值处理相关操作
通常遇到缺失值需要先找出或查看缺失值isnull()/notnull(),然后填充fillna()或删除dropna()缺失值。
本文案例数据集下载(也可评论或私信作者获取数据集)
- 查找缺失值isnull()以及notnull()函数
该方法对对象进行元素级操作,返回一组布尔值True/False。
#导入数据
fileDf=pd.read_excel('Python数据/朝阳医院2018年销售数据.xlsx',sheet_name='Sheet1')
fileDf.head()
>>>
购药时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额
0 2018-01-01 星期五 1.616528e+06 236701.0 强力VC银翘片 6.0 82.8 69.00
1 2018-01-02 星期六 1.616528e+06 236701.0 清热解毒口服液 1.0 28.0 24.64
2 2018-01-06 星期三 1.260283e+07 236701.0 感康 2.0 16.8 15.00
3 2018-01-11 星期一 1.007034e+10 236701.0 三九感冒灵 1.0 28.0 28.00
4 2018-01-15 星期五 1.015543e+08 236701.0 三九感冒灵 8.0 224.0 208.00
#isnull()返回一组布尔值
print(fileDf['购药时间'].isnull().head())
>>>
0 False
1 False
2 False
3 False
4 False
Name: 购药时间, dtype: bool
#查看某些有缺失值字段的数据情况
fileDf[fileDf['购药时间'].isnull()|fileDf['社保卡号'].isnull()]
>>>
购药时间 社保卡号 商品编码 商品名称 销售数量 应收金额 实收金额
6570 NaN 11778628.0 2367011.0 高特灵 10.0 56.0 56.00
6571 2018-04-25 星期二 NaN 2367011.0 高特灵 2.0 11.2 9.86
6574 NaN NaN NaN NaN NaN NaN NaN
- 填充缺失值fillna()函数
fillna(value=None, axis=0, inplace=False)
利用value来填充相应的缺失值,默认inplace不替换原数据只是产生副本。
#填充缺失值
print('填充前缺失情况:',fileDf[['购药时间','社保卡号']][fileDf['购药时间'].isnull()|fileDf['社保卡号'].isnull()])
#利用购药时间列的众数来填充缺失值
fileDf['购药时间'].fillna(fileDf['购药时间'].mode()[0],inplace=True)
print('填充后缺失情况:',fileDf[['购药时间','社保卡号']][fileDf['购药时间'].isnull()|fileDf['社保卡号'].isnull()])
>>>
填充前缺失情况: 购药时间 社保卡号
6570 NaN 11778628.0
6571 2018-04-25 星期二 NaN
6574 NaN NaN
填充后缺失情况: 购药时间 社保卡号
6571 2018-04-25 星期二 NaN
6574 2018-04-15 星期五 NaN
- 剔除缺失值dropna()函数
dropna(subset=[],axis=0, how='any', thresh=None)
删除指定列subset中有缺失值的数据,默认inplace不替换原数据只是产生副本,how可选any或all,all仅在切片中数据全部缺失时才剔除。
#删除缺失值
print('删除前缺失情况:',fileDf[['购药时间','社保卡号']][fileDf['购药时间'].isnull()|fileDf['社保卡号'].isnull()])
#删除购药时间中有缺失值的数据
fileDf.dropna(subset=['购药时间'],inplace=True)
print('删除后缺失情况:',fileDf[['购药时间','社保卡号']][fileDf['购药时间'].isnull()|fileDf['社保卡号'].isnull()])
>>>
删除前缺失情况: 购药时间 社保卡号
6570 NaN 11778628.0
6571 2018-04-25 星期二 NaN
6574 NaN NaN
删除后缺失情况: 购药时间 社保卡号
6571 2018-04-25 星期二 NaN