以泰坦尼克号数据集为例,如何统计每个字段的非na值数量?
发布于 作者:苏南大叔 来源:程序如此灵动~实际工作中遇到的数据集都会存在着多多少少的不完美数据,即空值na
数据。面对这些不完美数据,在做进一步的处理之前。还应该有个大体的空值数量的了解和认知。本文就是对这一点进行讨论的。
苏南大叔的"程序如此灵动"博客,记录苏南大叔的代码编程经验文章。本文测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
,xlrd@2.0.1
,openpyxl@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
结束语
对空值的基本情况有了大体的了解后,下一步的操作就是如何消灭掉这些空值了,文章待续。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。