我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

实际工作中遇到的数据集都会存在着多多少少的不完美数据,即空值na数据。面对这些不完美数据,在做进一步的处理之前。还应该有个大体的空值数量的了解和认知。本文就是对这一点进行讨论的。

苏南大叔:以泰坦尼克号数据集为例,如何统计每个字段的非na值数量? - 空值字段统计
以泰坦尼克号数据集为例,如何统计每个字段的非na值数量?(图1-1)

苏南大叔的"程序如此灵动"博客,记录苏南大叔的代码编程经验文章。本文测试环境:python@3.12.3pandas@2.2.2numpy@1.26.4xlrd@2.0.1openpyxl@3.1.2

前置阅读

本文的主要目标就是:加载泰坦尼克数据集,并识别出它的空值情况。前置阅读的文章有:

老生常谈,在读取excel文件的时候,可以通过na_values参数,控制各种不合理的值为空值。测试代码:

import pandas as pd
file = "http://hbiostat.org/data/repo/titanic3.xls"
df = pd.read_excel(file, "titanic3", index_col=None, na_values=['NA'])

这个的na_values的设置,就是需要根据每个数据集的实际情况进行处理了。

df.describe()

df.describe()方法的具体解释,参考下面的文章:

对于每个DataFrame的字段空值统计的需求来说,由于这个.describe()方法的返回值,都是一些平均数/最大值/最小值/中位数之类的统计,所以能说明的问题不多。不推荐。

print(df.describe())

返回值:

            pclass     survived          age        sibsp        parch         fare        body
count  1309.000000  1309.000000  1046.000000  1309.000000  1309.000000  1308.000000  121.000000
mean      2.294882     0.381971    29.881135     0.498854     0.385027    33.295479  160.809917
std       0.837836     0.486055    14.413500     1.041658     0.865560    51.758668   97.696922
min       1.000000     0.000000     0.166700     0.000000     0.000000     0.000000    1.000000
25%       2.000000     0.000000    21.000000     0.000000     0.000000     7.895800   72.000000
50%       3.000000     0.000000    28.000000     0.000000     0.000000    14.454200  155.000000
75%       3.000000     1.000000    39.000000     1.000000     0.000000    31.275000  256.000000
max       3.000000     1.000000    80.000000     8.000000     9.000000   512.329200  328.000000

df.info() [推荐]

df.info()可以对这个需求进行比较好的处理。参考文章:

print(df.info())

返回值:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 14 columns):
 #   Column     Non-Null Count  Dtype
---  ------     --------------  -----
 0   pclass     1309 non-null   int64
 1   survived   1309 non-null   int64
 2   name       1309 non-null   object
 3   sex        1309 non-null   object
 4   age        1046 non-null   float64
 5   sibsp      1309 non-null   int64
 6   parch      1309 non-null   int64
 7   ticket     1309 non-null   object
 8   fare       1308 non-null   float64
 9   cabin      295 non-null    object
 10  embarked   1307 non-null   object
 11  boat       486 non-null    object
 12  body       121 non-null    float64
 13  home.dest  745 non-null    object
dtypes: float64(3), int64(4), object(7)
memory usage: 143.3+ KB
None

返回值里面,有个Non-Null Count,非空值数量。可以看到:明显有些字段是有问题的。

df.count() [推荐]

df.count()则可以更直接的统计出其中的空值的数量。但是,这个返回值则不侧重于非空值的统计。但是对于泰坦尼克号这个数据集来说,因为存在着全部不为空值的字段。所以,也是可以直观的感受到非空值的数量的。

print(df.count())

输出:

pclass       1309
survived     1309
name         1309
sex          1309
age          1046
sibsp        1309
parch        1309
ticket       1309
fare         1308
cabin         295
embarked     1307
boat          486
body          121
home.dest     745
dtype: int64

还可以直接计算某个字段的非空值(正常值)的数量。

print(df.count()["cabin"])

输出:

295

isna()扩展

如果对.isna()的结果进行统计的话,也是可以的。不过就是表达式略显复杂,显得效率有待提升。

print(len(df[df.isna()["cabin"] == False]))

输出:

295

数据总条数 / 空值条数

特别需要注意的是:本文统计的是非空值,而不是空值。所以,想得到空值数量的话,还需要使用总条数减去上面得到的值。可以使用下面的方式,来直观的获得数据总条数。

print(len(df.index))

输出:

1309

结束语

对空值的基本情况有了大体的了解后,下一步的操作就是如何消灭掉这些空值了,文章待续。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python