赞
踩
在数据处理的时候,往往遇到很多坑,而这些坑有很多时候是由于空值造成的。
1. 对Pandas数据框统计空值
Python的数据如果是用pandas读进来,一个有效办法是调用pandas.DataFrame.isna()来找空值。 这里介绍一个很有效的tip:
拿COVID19数据举例,数据前三行如下:
# 计算每一列里的空值比例
df.isnull().sum()/len(df)
这样就可以看到,其实在 Province_State这一列,有超过一半的值是空值。
需要注意的是,上述代码等同于df.isna().sum()/len(df), 这两种方法其实是一样的(具体可以查阅Pandas对这两种方法的官方文档)。
之所以存在isna()和isnull()这两种名称,是因为pandas数据框是参考了R语言的数据框格式。 在R语言里, na和null是两个不同的值,pandas就直接把这两个名字抄了过来;但是pandas的底层是numpy,而在numpy里,只有NaN(没有n,也没有null),NaN代表的意思是Not a Number。所以pandas用isna()或者isnull()查找出来的结果其实是'NaN'。
比如上述df, 我们用
df.Province_State.unique()
去看其体这一列里都有哪些值,会发现,结果是这样的:
array([nan, 'Australian Capital Territory', 'New South Wales',
'Northern Territory', 'Queensland',...])
也就是说,有54.78%的值都是nan.
2. 小心区分Pandas里的NaN, None, ''(空串)
先看两段代码,注意NaN的写法:
df_tmp = {"id":[1,2,3,4,5],
"birthday":['2000-01-01','',None,'2000-01-19',np.NaN],
"name":['王菲','莫文蔚',np.NaN,None,'林宥嘉'],
"score":[100,99,np.NaN,98,None]}
# 注意:‘‘是空串,NaN是np.Nan,不是字符串'NaN'!
df_tmp = pd.DataFrame(df_tmp)
df_tmp
2-1. 先用上面介绍的方法统计一下空值:
df_tmp.isnull().sum()
isnull()统计出来的空值,都是None和np.Nan, 而像birthday里的那个空串'', 则不属于空值。
空值的一个坑在于:在做运算的时候它们是被忽略的。
print(df_tmp['birthday'].count())
print(df_tmp['name'].count())
print(df_tmp['score'].count())
>>> 3
>>> 3
>>> 3
注意,这里birthday.count()的3是这三个值: '2000-01-01', '', '2000-01-19'。 再一次的,注意了,count()只忽略None, np.NaN, 但是不会忽略''空串。
同时,需要注意的是,不仅是count的时候会忽略空值,groupby也会。比如
df_tmp.groupby(['birthday','name'],as_index=False).count()
结果如下:
说明,当groupby的列里有空值时,就不会出现在结果中。 这是一个很大的坑,比如当我们对dataframe做groupby想看看有多少种组合时,就得小心,一旦遇上了空值,就会让你的组合少很多。
**思考**:如果在构造这个数据框的时候,没有用np.NaN,而是直接用了字符串'NaN', 会有什么区别呢?
**答案**,字符串'NaN'虽然在数据框的展示效果上是一模一样的,但是在统计空值的时候,就不会被计入空值。
举个粟子:
df_tmp = {"id":[1,2,3,4,5],
"birthday":['2000-01-01','',None,'2000-01-19','NaN'],
"name":['王菲','莫文蔚','NaN',None,'林宥嘉'],
"score":[100,99,'NaN',98,None]}
df_tmp = pd.DataFrame(df_tmp)
df_tmp.isnull().sum()
得到的结果是:
所以记住了,np.nan是一种空值,'NaN'和'' 一样,虽然没有实质性的值,但是都是字符串,运算的时候不会被忽略。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。