pandas查看缺失数据占比(实战)


在数据建模前,需要查看每一列数据的缺失情况,当缺失值的占比超过一定阈值,就需要考虑,这一列数据(或者这一个变量)是否需要参与建模。一般选用的阈值在0.9,即:当某一个变量的缺失值占比达到90%以上,就需要删除。

这里选用pandas作为主要的数据分析工具,感兴趣的读者可以去pandas官网逛逛,下面开始介绍,如何用pandas查看每一个变量的缺失占比情况,以及绘制出变量缺失分布的柱状图。


导包

import pandas as pdimport numpy as np

构造数据

df = pd.DataFrame(data={    "A":[np.nan,np.nan,np.nan,12,13,14],    "B":[np.nan,np.nan,12,13,14,15],    "C":[np.nan,12,13,14,15,16],    "D":[12,13,14,15,16,17],})

数据样式

      A     B     C   D0   NaN   NaN   NaN  121   NaN   NaN  12.0  132   NaN  12.0  13.0  143  12.0  13.0  14.0  154  13.0  14.0  15.0  165  14.0  15.0  16.0  17

查看数据缺失占比

((df.isnull().sum())/df.shape[0]).sort_values(ascending=False).map(lambda x:"{:.2%}".format(x))
A    50.00%B    33.33%C    16.67%D     0.00%dtype: object

可以看到,A变量的缺失值占比为50%,B变量的缺失值占比为33.33%,C变量的缺失值占比为16.67%,D变量缺失值占比为0%。

如果考虑到阈值为0.5,那么A变量就需要删除。关于这段代码的详细步骤,在下面会有解释说明。

分布柱状图

通过第四步的操作,可以看出数据的缺失占比情况;

这里需要画出数据每一个变量的缺失柱状图,考虑到有些变量没有缺失值,所以这里选用非缺失数据的占比情况,如下:

bar_dict = ((df.notnull().sum())/df.shape[0]).sort_values(ascending=False).to_dict()
# {'D': 1.0, 'C': 0.8333333333333334, 'B': 0.6666666666666666, 'A': 0.5}

pyecharts是我在工作中主要使用的可视化工具,所以这里选用pyecharts来绘制分布柱状图。感兴趣的读者可以去pyecharts官网逛逛。

这里,为了柱状图的美观,需要对数字的显示格式设置一下,将数据从小数转为百分比数据,设置如下:

label_opts=opts.LabelOpts(is_show=True,formatter='{@y}%')

详细绘图代码如下:

from pyecharts.charts import Barfrom pyecharts import options as optsfrom pyecharts.globals import _WarningControl_WarningControl.ShowWarning = False
c = (    Bar()    .add_xaxis(list(bar_dict))    .add_yaxis(        "非缺失数据占比",        [round(i*100,2) for i in list(bar_dict.values())],        label_opts=opts.LabelOpts(is_show=True,formatter='{@y}%'),    )    .set_global_opts(title_opts=opts.TitleOpts(title="缺失数据分析")))c.render_notebook()

绘制结果

 

 

代码详解

((df.isnull().sum())/df.shape[0]).sort_values(ascending=False).map(lambda x:"{:.2%}".format(x))

iisnull()方法作用于df中的每一个值,如果这个值为NAN,则为True,否则为False,最终返回一个与df有着相同行/列的DataFrame对象。

notnull()方法作用于df中的每一个值,如果这个值为NAN,则为False,否则为True,最终返回一个与df有着相同行/列的DataFrame对象。

# df.isnull()     A      B      C      D0   True   True   True  False1   True   True  False  False2   True  False  False  False3  False  False  False  False4  False  False  False  False5  False  False  False  False
# df.notnull()       A      B      C     D0  False  False  False  True1  False  False   True  True2  False   True   True  True3   True   True   True  True4   True   True   True  True5   True   True   True  True

DataFrame.sum()

求和计算,常用的参数

axis:求和方向,1表示求每一行的和,0表示求每一列的和。(默认为0)

# df.sum()A    39.0B    54.0C    70.0D    87.0dtype: float64
# df.sum(axis=1)0    12.01    25.02    39.03    54.04    58.0

DataFrame.shape

获取行和列,返回元组(行,列)

# df.shape(6, 4)

DataFrame.sort_values()

按照某一字段排序

by:按照某一列的数据排序,

ascending:False为降序,True为升序,(默认为True)


pandas.Series.map()

map方法,经常与lambda表达式连用,类似的操作还有:pandas.apply();pandas.applymap();

# 将每一个小数值变为百分比pandas.Series.map(lambda x:"{:.2%}".format(x))

往期精彩内容:

 

Pycharm 最新激活(持续更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bearx...

请作者喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值