找回密码
 会员注册
查看: 23|回复: 0

python之pandas中NaN与None的比较与处理

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71625
发表于 2024-9-6 15:24:28 | 显示全部楼层 |阅读模式
目录(1)NaN与None比较1.None和NaN的区别2.None和NaN创建示例3.None类型和数值类型运算会报错4.判断是否为NaN或者None用np.isnan()用np.isnull()(2)dataframe空值处理1.将NaN变为指定值:df.fillna(value)将空值变为指定值前向填充和后向填充使用fillna方法将NaN转换为零使用replace方法将NaN转换为零2.将None变为指定值3.删除空值NaN:df.dropna()4.是否为空值NaN或者None:df.isnull()5.df.empty判断df是否存在数据6.将类型为float的NaN变为int类型(1)NaN与None比较1.None和NaN的区别NaN是一个特殊的浮点数值,它表示缺失数据或不可用数据。在Pandas中,NaN表示一个缺失或无效的值,它是一个Pythonfloat对象。当我们在DataFrame中找到NaN时,我们通常希望使用其他值(如0)替换它,以便继续进行数据操作。None表示信息缺失,但其类型不是数字。因此,任何包含None值的列(比如PandasSeries)肯定不是数字类型,例如int或float。NaN也表示数据缺失,是数字类型。这意味着可以在int或float类型的数值列中找到NaN。2.None和NaN创建示例a.用np.nan生成空缺数值importnumpyasnpimportpandasaspdx=pd.Series([1,np.nan])print(x)print(x[1])print(type(x[1]))'运行运行运行结果01.01NaNdtype:float64nanb.创建None在下面的代码中,创建了None值。importpandasaspdx=pd.Series(["1",None])print(x)print(x[1])print(type(x[1]))'运行运行运行结果011NonedtypebjectNonec.None自动转换为NaN值在下面的测试中,None值会自动转换为NaN值,因为该list中的其他数值是数字,Pandas自动将None转换为NaN。NaN类型对于很多算术操作来更简单,因此被优先考虑。importpandasaspdx=pd.Series([1,None])print(x)print(x[1])print(type(x[1]))'运行运行运行结果01.01NaNdtype:float64nan3.None类型和数值类型运算会报错为什么我们说,使用NaN类型对于许多常用操作会更有利?因为NaN对许多算术运算来说是合法的。例如,下面涉及None的操作会报错:None+1运行报错---------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in---->1None+1TypeError:unsupportedoperandtype(s)for+:'NoneType'and'int'但如果是NaN类型,就不会报错。importnumpyasnpx=np.nan+1print(x)#nanprint(x==np.nan)#false#因为不能直接判断是否为nan,需要用相应函数'运行运行4.判断是否为NaN或者None用np.isnan()首先可以使用numpy,函数np.isnan()可以检查一个值是否为NaN值,但它不适用于None值。importnumpyasnpret=np.isnan(np.nan)print(ret)#True#ret=np.isnan(None)#TypeError:ufunc'isnan'notsupportedfortheinputtypes'运行运行用np.isnull()另一方法,isnull()可以用来检测缺失值, nan或None都将为True。print(np.isnan(np.nan))#Trueprint(pd.isnull(None))#True如果isnull()返回真,且isnan出现TypeError,说明是None类型。(2)dataframe空值处理1.将NaN变为指定值:df.fillna(value)将空值变为指定值importpandasaspdimportnumpyasnpdata=pd.DataFrame({'Qu1':[np.nan,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,np.nan,np.nan]},index=list('abcde'))print(data)#Qu1Qu2Qu3#aNaN21.0#b3.035.0#c4.012.0#d3.02NaN#e4.03NaNdata.fillna(999,inplace=True)print(data)'运行运行前向填充和后向填充DataFrame填充缺失值可以统一填充,也可以前向和后向填充:前向填充就是将空值填充为它上一个索引对应的值,如果是多个空值相连,则将这多个相连的空值填充为它们上面不为空值的那个值。data.fillna(method='ffill',inplace=True)print(data)#Qu1Qu2Qu3#aNaN21.0#b3.035.0#c4.012.0#d3.022.0#e4.034.0data.fillna(method='bfill',inplace=True)print(data)使用fillna方法将NaN转换为零Pandas中的fillna方法可用于将NaN替换为指定的值。我们可以使用该方法将DataFrame中的NaN替换为零。以下是使用该方法的示例代码:importpandasaspddata={'A':[1,2,np.nan,4],'B':[5,np.nan,7,8],'C':[9,10,11,np.nan]}df=pd.DataFrame(data)print(df)df_filled=df.fillna(0)print(df_filled)输出:ABC01.05.09.012.0NaN10.02NaN7.011.034.08.0NaNABC01.05.09.012.00.010.020.07.011.034.08.00.0如上所示,NaN值已被成功地替换为零使用replace方法将NaN转换为零除了使用fillna方法之外,我们还可以使用replace方法将NaN转换为零。与fillna方法不同的是,replace方法还可以用于替换其他指定的值,而不仅仅是NaN。以下是使用replace方法的示例代码:importpandasaspdimportnumpyasnpdata={'A':[1,2,np.nan,4],'B':[5,np.nan,7,8],'C':[9,10,11,np.nan]}df=pd.DataFrame(data)print(df)df_filled=df.replace(np.nan,0)print(df_filled)'运行运行输出ABC01.05.09.012.0NaN10.02NaN7.011.034.08.0NaNABC01.05.09.012.00.010.020.07.011.034.08.00.02.将None变为指定值importpandasaspddf2=pd.DataFrame(data=[[None,"x"],["y",None],["helloworld"]],columns=["A","B"])print(df2)'''AB0Nonex1yNone2helloworldNone'''print(df2["A"][0])#Noneprint(type(df2["A"][0]))##将为None的值变为"==="ret=df2.applymap(lambdax:"==="ifxisNoneelsex)print(ret)'''AB0===x1y===2helloworld===''''运行运行3.删除空值NaN:df.dropna()data=pd.DataFrame([[1,6.5,3],[1,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,6.5,3]])data.dropna()#输出#012#01.06.53.0对DataFrame来说,dropna方法如果发现缺失值,就会进行整行删除不过可以指定删除的方式,how=all,是当整行全是nan的时候才进行删除,同时还可以按指定的轴删除。data.dropna(how='all',axis=1,inplace=True)data#输出#012#01.06.53.0#11.0NaNNaN#2NaNNaNNaN#3NaN6.53.0还可以限制为指定的某些列存在空值时才删除整行数据#指定一些列中若含有空值,则去掉对应的行all_column=["name","date","time","quantity"]subset=all_column[1:-1]df_trade.dropna(subset=subset,how='any',inplace=True)剔除掉df类型数据某列数据中为空所在的行data=data[pd.isnull(data['column_name'])==False]4.是否为空值NaN或者None:df.isnull()importpandasaspdimportnumpyasnpdata=pd.DataFrame({'Qu1':[np.nan,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,np.nan]},index=list('abcde'))print(data)#Qu1Qu2Qu3#aNaN21.0#b3.035.0#c4.012.0#d3.024.0#e4.03NaNresult=data.isnull()print(result)#Qu1Qu2Qu3#aTrueFalseFalse#bFalseFalseFalse#cFalseFalseFalse#dFalseFalseFalse#eFalseFalseTrue'运行运行判断df某一项的值是否为空判断DataFrame中某一项的值是否为空的方法有两种:1.通过pd.isnull()来判断,语法格式:nan或None都将为Trueimportpandasaspdpd.isnull(data.loc[i,'column_name'])pd.isnull(data.loc[i,'column_name'])==Trueifnotpd.isnull(data.loc[i,'column_name']):pass2.通过np.nan来比较判断,语法格式:nan将为Truedf['column_name'][i]isnotnp.nan5.df.empty判断df是否存在数据如果这个 DataFrame 只有列名,但是没有实际数据,会被 DataFrame.empty 判定为空如果这个 DataFrame 仅由缺失值 (NaN) 构成,不会被 DataFrame.empty 判定为空importnumpyasnpimportpandasaspddf1=pd.DataFrame(data=None)print(df1.empty)#Truedf2=pd.DataFrame(data=[np.nan,np.nan])print(df2)'''00NaN1NaN'''print(df2.empty)#Falsedf3=pd.DataFrame(data=[np.nan,2])print(df3.empty)#False'运行运行6.将类型为float的NaN变为int类型一个简单例子df['A']=df['A'].astype(int)再一个例子,像在format函数中,用"06d"这类参数将整数类型格式化为指定格式的字符串时,元素只能是整数类型,当数据存在空值时会被加载为NaN值,如果其属于浮点数类型,则对NaN调用format函数时会报错ValueError: Unknown format code 'd' for object of type 'float'因此需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型需要先将其为NaN的行去掉,然后需要将包含NaN的列转换为int类型all_column=["name","date","time","quantity"]#指定一些列中若含有空值,则去掉对应的行subset=all_column[1:-1]df_trade.dropna(subset=subset,how='any',inplace=True)#浮点数类型转化为整数类型forcolinsubset:df_trade[col]=df_trade[col].astype(int)注意NaN为float类型时,.astype(int)转换,会发生错误ValueError:cannotconvertfloatNaNtointeger一个常见的替换值是0。您可以使用fillna()方法将所有NaNs替换为0,然后使用.astype(int)将该列转换为int类型。以下是一个示例代码:df['A']=df['A'].fillna(0).astype(int)end
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:48 , Processed in 0.542913 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表