【Python】数据处理第0步:关于空值和缺失值的处理

关于空值和缺失值:

  • 空值:在pandas中,空值就是空字符串 “”
  • 缺失值:np.nan(缺失数值),pd.naT(缺失时间),或None(缺失字符串)
  • 还有一类数据,比如 -999、0,可能是业务上定义的缺失值。

如何定义缺失值、空值?

  • 如何定义缺失值和空值,见我之前的博客文章 《自定义dataframe时如何为个别元素赋空值和缺失值》

如何判断是否缺失值?如何查找筛选缺失值、空值?

  • df.isna() 和 df.notna(),可以判断出None、pd.NaT、np.NaN 三种类型的缺失值;
  • 但是空字符串 “” 、0,不会认为是缺失值;
  • 另外对于4字符的字符串“None”、“null” ,也不会认为是缺失值。
  • df.isnull() 等同于 df.isna()
  • df.notnull() 等同于 df.notna()

见下代码:

df = pd.DataFrame({"name": ['Alfred', None, 'Catwoman'],
                   "toy": [np.nan, '', 'Bullwhip'],
                   "born": [pd.NaT, pd.Timestamp("1940-04-25"),pd.NaT]})
 
df

【Python】数据处理第0步:关于空值和缺失值的处理_第1张图片

# 找出 toy 列不为空的行
df[df['toy'].notna()]  #从筛选结果看, df.notna() 认为 np.nan是缺失值,但字符串空值不是缺失值

在这里插入图片描述

# 找出 name 列不为空的行
df[df['name'].notna()]   #可以看到 None 被 df.notna()认为是缺失值

在这里插入图片描述

# 找出 toy 列不为空的行
df[df['toy'].notnull()]   #df.notnull() 等同于 df.notna()

在这里插入图片描述

#找出 toy 列不为空,也不为空字符串的行
df[(df['toy'].notna()) & ( df['toy']!='')]  # 既要滤除缺失值,又要滤除空值

在这里插入图片描述

缺失值和空值被转换后会怎么样?

字符串类型缺失值 None:

  • None 被 astype(str)转换后,会变成一个4字符的字符串"None" (注意它会被isna() 识别为 False, 相当于一个正常的字符串),极具迷惑性。
  • None 被 pd.to_datetime()转换后,仍然是一个NoneType类型的 None缺失值,没变。
  • None 被 astype(np.int64) 或 np.int32() 转换时,会提示int()函数不接受NoneType类型的参数,转换无法进行。

数值类型缺失值 np.NaN:

  • np.NaN 被astype(str)转换后,会变成一个3字符的字符串"nan"。
  • 被 pd.to_datetime() 转换后,会变成 NaTType类型,即时间缺失值,仍然可以被isna()识别出来。
  • np.NaN 被np.int32() 转化时,会提示 float 类型的 NaN 不能被转换为 integer 类型,因为np.NaN 本身确实是个一个float类型。如果被np.float32() 转换后,则转换前后没有区别,仍然是 np.NaN 浮点型。

时间类型缺失值 pd.NaT:

  • pd.NaT 被astype(str) 转换后,会变成一个3字符的字符串"NaT"。
  • 被 pd.to_datetime() 转换前后无变化,仍然是 NaTType类型的缺失值。
  • pd.NaT 被np.int32() 转化后,会变成一个巨长的整数。被np.float32() 转换时,会提示 NaTType类型的缺失值无法转换。

代码示例:

#将name 列转换为字符串类型,然后判断其中的缺失值
df['name'] = df['name'].astype(str)
df[df['name'].isna()]   #一个结果都没有查出来

在这里插入图片描述
一个结果都没有查出来。

这是为什么呢?原因就是将列转换为字符串类型的过程中,缺失值 None 已经被转换为了字符串“None”,当然不是缺失值了。

这里给我教训,就是不要轻易将整列转换为某种类型,尤其是其中含有缺失值的话。

如果万一手欠,强行做了整列的类型转化,可以依据以上的总结,去揪出那些换了马甲的缺失值或空值。

你可能感兴趣的:(学习记录)