python null_关于Python的空值

在数据处理的时候,往往遇到很多坑,而这些坑有很多时候是由于空值造成的。

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'和'' 一样,虽然没有实质性的值,但是都是字符串,运算的时候不会被忽略。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值