拯救pandas计划(12)——转换包含np.nan的float64类型列为int64类型

2024-02-08 22:30

本文主要是介绍拯救pandas计划(12)——转换包含np.nan的float64类型列为int64类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拯救pandas计划(12)——转换包含np.nan的float64类型列为int64类型

最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下此系列以让更多的小伙伴们爱上pandas。

系列文章说明:

系列名(系列文章序号)——此次系列文章具体解决的需求

平台:

  • windows 10

  • python 3.8

  • pandas >=1.2.4

/ 数据需求

数据如下,需要将其中的浮点型数据转换为整型数据。

df = pd.DataFrame({'A': [1., 2., 3., None, np.nan, pd.NA, 4., 5., 6., 7., 8., 9.],'B': [1., 2., 3., None, None, None, 4., 5., 6., 7., 8., 9.],'C': [1., 2., 3., np.nan, np.nan, np.nan, 4., 5., 6., 7., 8., 9.],'D': [1., 2., 3., pd.NA, pd.NA, pd.NA, 4., 5., 6., 7., 8., 9.],'E': [1., 2., 3., 0.0, 0.0, 0.0, 4., 5., 6., 7., 8., 9.]}
)

打印出样式和各列的类型,看出圈出的两列数据发生了微妙的改变,None在浮点型数据丛中自动转换成了np.nan,而pd.NA<NA>显示,列类型除[0, 3]列外都是float64,似乎是pd.NA让列类型变化了。

88b98f41e8589756f2d3fb9027ea829c.png

/ 需求拆解

众所周知,在python中的numpy模块,独自闯出了一片天地,很多关于数据处理,科学计算,机器学习的模块会使用numpy模块,而其中的numpy.nan(以下称为np.nan)多多少少带点迷惑性,在python中空值使用None填充,而在更多的数据科学中使用的是np.nan,更令人奇怪的是np.nan是浮点型数据,在pandas模块为了解决这种情形,也设置了一个空类型属性`pandas.NA(以下称为pd.NA),在pandas中能够更好的适应数据的变化。

>>> None == None
True
>>> type(np.nan)
float
>>> np.nan == np.nan
False
>>> type(pd.NA)
pandas._libs.missing.NAType
>>> pd.NA == pd.NA
<NA>

在这一例中,因为np.nan在数据列中是无法进行整型化,一种是可以将数据框转化为二维列表再遍历其中的列表将所有浮点数转换,另一种则是将np.nan转换为pd.NA,适应pandas结构,再转换各自的列。

可能注意到,上述没有提及NoneNone是一个随性的值,当有pd.NA存在时保持本性,而没有时就会随列类型变化,如B列中的None

/ 需求处理

在pandas里有几种方法可以转换数据类型,这里试用一些方法,将每列都转换成int类型:

  • astype(int)

>>> df['A'].astype(int)
TypeError  
...
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'>>> df['B'].astype(int)
ValueError
...
ValueError: Cannot convert non-finite values (NA or inf) to integer>>> df['C'].astype(int)
ValueError
...
ValueError: Cannot convert non-finite values (NA or inf) to integer>>> df['D'].astype(int)
TypeError
...
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NAType'>>> df['E'].astype(int)
0     1
1     2
2     3
3     0
4     0
5     0
6     4
7     5
8     6
9     7
10    8
11    9
Name: E, dtype: int32

每列都操作完后,几乎全军覆没,除了E列中所有的数都是有效数字外可以完成目标,其他的都发生了报错,报错原因基本都是int这个函数不能转换空值或者无效值。

  • map(int)

map(int)执行效果与上一个方法一样。但在pandas.map里可以使用函数,对每个值进行判断如果是空值则返回pd.NA,否则转换为int类型。

>>> df['A'].map(lambda x: pd.NA if pd.isna(x) else int(x))
0        1
1        2
2        3
3     <NA>
4     <NA>
5     <NA>
6        4
7        5
8        6
9        7
10       8
11       9
Name: A, dtype: object

后续的几列都能够完成转换,虽然类型转为了object,通过值判断可以确定已经将之前的浮点型数据转换为整型了。

可能会想,使用pd.NA可以转化成功,那么使用np.nan呢,具体原因在前文已经说明,不再赘述,可以自行测试。

(手动水印:原创CSDN宿者朽命,https://blog.csdn.net/weixin_46281427?spm=1011.2124.3001.5343,公众号A11Dot派)

  • astype('Int64')

pandas中的astype还可以转换为pandas中的Int64Dtype类型,注意astype中的大小写,其中的数字为整型,空值为pd.NA。转换效果与map(lambda x: ...)一样,不同处是列类型,这里为Int64Dtype,该类型可能在后续操作会有部分限制。

>>> df['A'].astype('Int64')
0        1
1        2
2        3
3     <NA>
4     <NA>
5     <NA>
6        4
7        5
8        6
9        7
10       8
11       9
Name: A, dtype: Int64 
>>> df['C'].astype('Int64')

/ 总结

简单的介绍了在数据框中包含空值,且需要将其中的浮点型数据转换为整型数据如何处理,因为在numpy中定义nan为浮点型数据,比通常的浮点型数据,如1.1之类的有多了些特性,在pandas中的部分操作中可能无法满足自身要求,这时不妨试试pandas中pd.NA来代替np.nan的使用,在平平凡凡的数据里也有多样的天空。

道可道,非常道。


于二零二二年四月十五作

这篇关于拯救pandas计划(12)——转换包含np.nan的float64类型列为int64类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692389

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型