关于空值和缺失值:
空值:在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
# 找出 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”,当然不是缺失值了。
这里给我教训,就是不要轻易将整列转换为某种类型,尤其是其中含有缺失值的话。
如果万一手欠,强行做了整列的类型转化,可以依据以上的总结,去揪出那些换了马甲的缺失值或空值。
本文介绍了Python中pandas处理空值和缺失值的方法,包括如何定义、判断和筛选缺失值,以及不同类型的缺失值在转换过程中的表现。通过示例代码展示了None、np.nan、pd.NaT的处理方式,并强调了类型转换可能导致的混淆,提醒读者谨慎处理含有缺失值的数据列。

被折叠的 条评论
为什么被折叠?



