python 空值转化为0_【Python】数据处理第0步:关于空值和缺失值的处理

本文介绍了Python中pandas处理空值和缺失值的方法,包括如何定义、判断和筛选缺失值,以及不同类型的缺失值在转换过程中的表现。通过示例代码展示了None、np.nan、pd.NaT的处理方式,并强调了类型转换可能导致的混淆,提醒读者谨慎处理含有缺失值的数据列。

关于空值和缺失值:

空值:在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”,当然不是缺失值了。

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值