报表中pandas缺失值的处理与保留

本文介绍了Pandas1.0版本后处理缺失值的改进方法,包括如何正确识别不同类型缺失值、新类型的使用避免错误,以及在合并数据时对pd.NA的处理策略。重点讲解了日期型和数值型缺失值的判断技巧,以及在数据类型维护和合并操作中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做一些如金融分析报表的时候,一般既不可以像平常机器学习那样直接dropna将缺失值一删了之,也不能插值。
这时候缺失值的处理就可能比较麻烦。

一、先抛砖引玉说几个pandas1.0之前的常见问题(pandas1.0之后保留了这些,但使用新类型可以避免):

1、pandas会将数值型缺失值读取为NAN(not a number),日期型缺失值读取为NAT(not a time)。如对于是NAN的变量a可使用pandas的方法pd.isna(a)和类型if a is pd.NaT识别,

注意:能用pandas的内置就用pandas的内置。这种缺失值不要用numpy的方法判断如np.isnan(a)np.isnat(a)if a is np.nan,可能会出错。

2、==一般用于判断值是否相等,如判断np.inf,而在判断类型时候非常麻烦,甚至np.nan==np.nan都会返回False。在缺失值判断上用is或用内置方法是更明智的选择,用isnp.nan is np.nan会返回True。
3、pandas中的每一列都是相同类型,所以pandas读入NAN后,可能就模糊了对象原来的类型,这一点在pandas1.0之前需要注意,会造成麻烦:

若那列本应是数值型的:会导致那一列全部变成np.float64,所以有时候年份2021都会在dataframe中显示成2007.0。看着不爽想转为int就会报错:

ValueError: cannot convert float NaN to integer 

(1)实际上输出到文件的时候不会显示2007后面的小数0;

(2)merge匹配合并表时候,即使年份作为主键也不会比较主键的类型,而是只比较值,所以一个int和一个float是可以放心匹配的,float64的缺失值nan也是可以正常匹配的;

(3)注意在pandas1.0中,merge两个dataframe时,如果dataframe中的缺失值是pd.NA是不可以的,需要填补缺失值。
比如经过dataframe.convert_dtypes()dataframe.fillna(pd.NA, inplace=True),现在原来的缺失值都转为pd.NA,那么为了merge,就必须要把缺失值转为float64,使用dataframe.fillna(np.nan, inplace=True),后续版本不知道这个bug修复没有。
参考《Merging two dataframes with pd.NA in merge column yields ‘TypeError: boolean value of NA is ambiguous’》

(4)若那列本应是字符型的:会导致那一列全部变成大的对象类型object

4、缺失值使用方式如下:
if a is pd.NaT:		# 注意不是==pd.NaT
	如果是个日期缺失值,怎么怎么样
if pd.isna(a):
	如果是个数值缺失值,怎么怎么样
if pd.notna(a):
	如果不是数值缺失值,怎么怎么样

部分参考:
《python2与python3中关于对NaN类型数据的判断和转换》

二、正当我准备写下去时候,发现了一篇特好的文章

所以我才说前面作为我的一点感受,只是抛砖引玉。重点是看下面这篇文章,尤其是pandas1.0之后的新特性。链接的文章注意排版有个小问题

s_time = pd.Series([pd.Timestamp('20120101')]*5)s_time

实际上是

s_time = pd.Series([pd.Timestamp('20120101')]*5)
s_time

《收藏|Pandas缺失值处理看这一篇就够了!》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值