关于numpy和pandas中关于nan的几个总结

摘要

  • 仅个人总结,不保证绝对正确,
  • 仅服务个人。
  • 本意是纪录文章最后的黑体字部分。

正文

  • 在计算平均值等类似操作的时候numpy中的nan会参与计算,而pandas的nan不会。
  • np中的nan是float类型,所以在进行相关操作的时候需要将别的数据类型(int->float)进行转换,但是pandas中你不用考虑这个问题。
  • 对比下面两片将nan替换为均值的代码就可以知道两者在处理nan数值的不同之处了:
代码1(numpy):
import numpy as np
def replace_nan(t):
    for i in range(t.shape[1]): 
        t_col=t[:,i] 
        nan_num=np.count_nonzero(t_col != t_col)
        if nan_num !=0: 
            no_have_nan=t_col[t_col==t_col] 
            t_col[np.isnan(t_col)]=no_have_nan.mean()
    return t


t = np.arange(12).reshape((3,4)).astype("float")
t[1,2:] = np.nan
print(t)
replace_nan(t)
print(t)
代码1(pandas):
In [64]: t2
Out[64]: 
    age      name      tel
0  32.0  xiaowang  10086.0
1   NaN  xiaohong  10000.0
2  22.0  xiaowang      NaN
In [67]: t2.fillna(t2.mean())
Out[67]:
    age      name      tel
0  32.0  xiaowang  10086.0
1  27.0  xiaohong  10000.0
2  22.0  xiaowang  10043.0

# 你也可以只处理age这一列
t2["age"]=t2["age"].fillna(t2["age"].mean())  

另外

  • 在爬虫中爬取数据的时候,如果有些字段没有数据,就不要这些字段添加数据,就让其空着(也就是xpath中的extract_first()),到时候在数据分析的时候就会自动将该字段转为Nan的。(经过测试发现(基于csv文件测试):如果根本没有该字段,或者存储的时候存的是null,在读取的时候会自动转为nan的
  • 一般数据存储的时候会选择mongodb的原因之一是:mysql中是不允许没有字段的,即使什么没有也会显示NULL,但是mongodb是允许某些字段是不存在的。
  • 处理数据为0的数据时一般可以:t[t==0]=np.nan(这是因为在计算均值的时候nan不会参加计算,但是0会)
  • 如果有的缺失值是用?标记的话,那么可以用df[“xx”].str.replace("?",np.nan)来处理该数据。
发布了55 篇原创文章 · 获赞 3 · 访问量 2737

猜你喜欢

转载自blog.csdn.net/rusi__/article/details/103099785