手把手教你用pandas处理缺失值
导读:在进行数据分析和建模的过程中 , 大量的时间花在数据准备上:加载、清理、转换和重新排列 。 本文将讨论用于缺失值处理的工具 。
缺失数据会在很多数据分析应用中出现 。 pandas的目标之一就是尽可能无痛地处理缺失值 。
作者:韦斯·麦金尼(WesMcKinney)
译者:徐敬一
来源:华章科技
文章图片
pandas对象的所有描述性统计信息默认情况下是排除缺失值的 。
pandas对象中表现缺失值的方式并不完美 , 但是它对大部分用户来说是有用的 。 对于数值型数据 , pandas使用浮点值NaN(NotaNumber来表示缺失值) 。 我们称NaN为容易检测到的标识值:
In:
string_data=https://pcff.toutiao.jxnews.com.cn/p/20210204/pd.Series(['aardvark','artichoke',np.nan,'avocado'])string_dataOut:
0aardvark1artichoke2NaN3avocadodtype:objectIn:
string_data.isnull()Out:
0False1False2True3Falsedtype:bool在pandas中 , 我们采用了R语言中的编程惯例 , 将缺失值成为NA , 意思是notavailable(不可用) 。 在统计学应用中 , NA数据可以是不存在的数据或者是存在但不可观察的数据(例如在数据收集过程中出现了问题) 。 当清洗数据用于分析时 , 对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要 。
Python内建的None值在对象数组中也被当作NA处理:
In:
string_data[0]=Nonestring_data.isnull()Out:
0True1False2True3Falsedtype:boolpandas项目持续改善处理缺失值的内部细节 , 但是用户API函数 , 比如pandas.isnull , 抽象掉了很多令人厌烦的细节 。 处理缺失值的相关函数列表如下:
dropna:根据每个标签的值是否是缺失数据来筛选轴标签 , 并根据允许丢失的数据量来确定阈值fillna:用某些值填充缺失的数据或使用插值方法(如“ffill”或“bfill”) 。 isnull:返回表明哪些值是缺失值的布尔值notnull:isnull的反作用函数01过滤缺失值
有多种过滤缺失值的方法 。 虽然你可以使用pandas.isnull和布尔值索引手动地过滤缺失值 , 但dropna在过滤缺失值时是非常有用的 。 在Series上使用dropna , 它会返回Series中所有的非空数据及其索引值:
In:
fromnumpyimportnanasNAdata=https://pcff.toutiao.jxnews.com.cn/p/20210204/pd.Series([1,NA,3.5,NA,7])data.dropna()Out:
01.023.547.0dtype:float64上面的例子与下面的代码是等价的:
In:
data[data.notnull()]Out:
01.023.547.0dtype:float64当处理DataFrame对象时 , 事情会稍微更复杂一点 。 你可能想要删除全部为NA或包含有NA的行或列 。 dropna默认情况下会删除包含缺失值的行:
In:
data=https://pcff.toutiao.jxnews.com.cn/p/20210204/pd.DataFrame([[1.,6.5,3.],[1.,NA,NA][NA,NA,NA],[NA,6.5,3.]])cleaned=data.dropna()dataOut:
01201.06.53.011.0NaNNaN2NaNNaNNaN3NaN6.53.0In:
cleanedOut:
01201.06.53.0传入how='all’时 , 将删除所有值均为NA的行:
In:
data.dropna(how='all')Out:
01201.06.53.011.0NaNNaN3NaN6.53.0如果要用同样的方式去删除列 , 传入参数axis=1:
In:
data[4]=NAdataOut:
012401.06.53.0NaN11.0NaNNaNNaN2NaNNaNNaNNaN3NaN6.53.0NaNIn:
data.dropna(axis=1,how='all')Out:
01201.06.53.011.0NaNNaN2NaNNaNNaN3NaN6.53.0过滤DataFrame的行的相关方法往往涉及时间序列数据 。 假设你只想保留包含一定数量的观察值的行 。 你可以用thresh参数来表示:
In:
df=pd.DataFrame(np.random.randn(7,3))df.iloc[:4,1]=NAdf.iloc[:2,2]=NAdfOut:
0120-0.204708NaNNaN1-0.555730NaNNaN20.092908NaN0.76902331.246435NaN-1.29622140.2749920.2289131.35291750.886429-2.001637-0.37184361.669025-0.438570-0.539741In:
df.dropna()Out:
01240.2749920.2289131.35291750.886429-2.001637-0.37184361.669025-0.438570-0.539741In:
df.dropna(thresh=2)Out:
01220.092908NaN0.76902331.246435NaN-1.29622140.2749920.2289131.35291750.886429-2.001637-0.37184361.669025-0.438570-0.53974102补全缺失值
你有时可能需要以多种方式补全“漏洞” , 而不是过滤缺失值(也可能丢弃其他数据) 。
大多数情况下 , 主要使用fillna方法来补全缺失值 。 调用fillna时 , 可以使用一个常数来替代缺失值:
In:
df.fillna(0)Out:
0120-0.2047080.0000000.0000001-0.5557300.0000000.00000020.0929080.0000000.76902331.2464350.000000-1.29622140.2749920.2289131.35291750.886429-2.001637-0.37184361.669025-0.438570-0.539741在调用fillna时使用字典 , 你可以为不同列设定不同的填充值:
In:
df.fillna({1:0.5,2:0})Out:
0120-0.2047080.5000000.0000001-0.5557300.5000000.00000020.0929080.5000000.76902331.2464350.500000-1.29622140.2749920.2289131.35291750.886429-2.001637-0.37184361.669025-0.438570-0.539741fillna返回的是一个新的对象 , 但你也可以修改已经存在的对象:
- 黄多多打耳钉染头发,为何黄磊从不管教?成绩单打脸无数黑粉
- 新手小白看过来,不到10块钱教你自己更换凌渡车钥匙电池
- 穿长靴别再搭打底裤了,教你杨幂的新穿法,孙怡都抢着这样穿
- 中年|中国四大佛教名山是哪些?有你旅游过的名山吗?一起来看看吧!
- 济南少儿编程:济南市教育厅发布人工智能试点学校!看看你的学校在里面吗?
- 你的言行中,藏着孩子未来的教养,任性大人当不得
- 女人到了60岁,最好不要烫小卷,教你这样选发型,时髦减龄又洋气
- 教育部|教育部推荐小学阅读110套书,平均2周半要读1套,读得完吗?
- 教育|想让你的孩子用最优秀的教师教吗?那就支持老师们涨工资吧!
- 严查! 江西抚州宣布教育“三违”举报电话
