Pandas实现数据类型转换的一些小技巧汇总


Posted in Python onMay 07, 2018

前言

Pandas是Python当中重要的数据分析工具,利用Pandas进行数据分析时,确保使用正确的数据类型是非常重要的,否则可能会导致一些不可预知的错误发生。

Pandas 的数据类型:数据类型本质上是编程语言用来理解如何存储和操作数据的内部结构。例如,一个程序需要理解你可以将两个数字加起来,比如 5 + 10 得到 15。或者,如果是两个字符串,比如「cat」和「hat」,你可以将它们连接(加)起来得到「cathat」。尚学堂•百战程序员陈老师指出有关 Pandas 数据类型的一个可能令人困惑的地方是,Pandas、Python 和 numpy 的数据类型之间有一些重叠。

大多数情况下,你不必担心是否应该明确地将熊猫类型强制转换为对应的 NumPy 类型。一般来说使用 Pandas 的默认 int64 和 float64 就可以。我列出此表的唯一原因是,有时你可能会在代码行间或自己的分析过程中看到 Numpy 的类型。
数据类型是在你遇到错误或意外结果之前并不会关心的事情之一。不过当你将新数据加载到 Pandas 进行进一步分析时,这也是你应该检查的第一件事情。

笔者使用Pandas已经有一段时间了,但是还是会在一些小问题上犯错误,追根溯源发现在对数据进行操作时某些特征列并不是Pandas所能处理的类型。因此本文将讨论一些小技巧如何将Python的基本数据类型转化为Pandas所能处理的数据类型。

Pandas、Numpy、Python各自支持的数据类型

Pandas实现数据类型转换的一些小技巧汇总

从上述表格中可以看出Pandas支持的数据类型最为丰富,在某种情形下Numpy的数据类型可以和Pandas的数据类型相互转化,毕竟Pandas库是在Numpy的基础之上开发的的。

引入实际数据进行分析

数据类型是你平常可能不太关心,直到得到了错误的结果才映像深刻的东西,因此在这里引入一个实际数据分析的例子来加深理解。

import numpy as np
import pandas as pd

data = pd.read_csv('data.csv', encoding='gbk') #因为数据中含有中文数据
data

Pandas实现数据类型转换的一些小技巧汇总

数据加载完毕,如果现在想要在该数据上进行一些操作,比如把数据列2016、2017对应项相加。

data['2016'] + data['2017'] #想当然的做法

Pandas实现数据类型转换的一些小技巧汇总

从结果来看并没有像想象中那样数值对应相加,这是因为在Pandas中object类型相加等价于Python中的字符串相加。

data.info() #在对数据进行处理之前应该先查看加载数据的相关信息

Pandas实现数据类型转换的一些小技巧汇总

在看到加载数据的相关信息后可以发现如下几个问题:

  • 客户编号的数据类型是int64而不是object类型
  • 2016、2017列的数据类型是object而不是数值类型(int64、float64)
  • 增长率、所属组的数据类型应该为数值类型而不是object类型
  • year、month、day的数据类型应该为datetime64类型而不是object类型

Pandas中进行数据类型转换有三种基本方法:

  • 使用astype()函数进行强制类型转换
  • 自定义函数进行数据类型转换
  • 使用Pandas提供的函数如to_numeric()、to_datetime()

使用astype()函数进行类型转换

对数据列进行数据类型转换最简单的方法就是使用astype()函数

data['客户编号'].astype('object')

data['客户编号'] = data['客户编号'].astype('object') #对原始数据进行转换并覆盖原始数据列

Pandas实现数据类型转换的一些小技巧汇总

上面的结果看起来很不错,接下来给出几个astype()函数作用于列数据但失效的例子

data['2017'].astype('float')

Pandas实现数据类型转换的一些小技巧汇总

data['所属组'].astype('int')

Pandas实现数据类型转换的一些小技巧汇总

从上面两个例子可以看出,当待转换列中含有不能转换的特殊值时(例子中¥,ErrorValue等)astype()函数将失效。有些时候astype()函数执行成功了也并不一定代表着执行结果符合预期(神坑!)

data['状态'].astype('bool')

Pandas实现数据类型转换的一些小技巧汇总

乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为True了,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。

总结一下astype()函数有效的情形:

  • 数据列中的每一个单位都能简单的解释为数字(2, 2.12等)
  • 数据列中的每一个单位都是数值类型且向字符串object类型转换

如果数据中含有缺失值、特殊字符astype()函数可能失效。

使用自定义函数进行数据类型转换

该方法特别适用于待转换数据列的数据较为复杂的情形,可以通过构建一个函数应用于数据列的每一个数据,并将其转换为适合的数据类型。

对于上述数据中的货币,需要将它转换为float类型,因此可以写一个转换函数:

def convert_currency(value):
 """
 转换字符串数字为float类型
 - 移除 ¥ ,
 - 转化为float类型
 """
 new_value = value.replace(',', '').replace('¥', '')
 return np.float(new_value)

现在可以使用Pandas的apply函数通过covert_currency函数应用于2016列中的所有数据中。

data['2016'].apply(convert_currency)

Pandas实现数据类型转换的一些小技巧汇总

该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。如果利用lambda表达式改写一下代码,可能会比较简洁但是对新手不太友好。

data['2016'].apply(lambda x: x.replace('¥', '').replace(',', '')).astype('float')

当函数需要重复应用于多个列时,个人推荐使用第一种方法,先定义函数还有一个好处就是可以搭配read_csv()函数使用(后面介绍)。

#2016、2017列完整的转换代码
data['2016'] = data['2016'].apply(convert_currency)
data['2017'] = data['2017'].apply(convert_currency)

同样的方法运用于增长率,首先构建自定义函数

def convert_percent(value):
 """
 转换字符串百分数为float类型小数
 - 移除 %
 - 除以100转换为小数
 """
 new_value = value.replace('%', '')
 return float(new_value) / 100

使用Pandas的apply函数通过covert_percent函数应用于增长率列中的所有数据中。

data['增长率'].apply(convert_percent)

使用lambda表达式:

data['增长率'].apply(lambda x: x.replace('%', '')).astype('float') / 100

结果都相同:

Pandas实现数据类型转换的一些小技巧汇总

为了转换状态列,可以使用Numpy中的where函数,把值为Y的映射成True,其他值全部映射成False。

data['状态'] = np.where(data['状态'] == 'Y', True, False)

同样的你也可以使用自定义函数或者使用lambda表达式,这些方法都可以完美的解决这个问题,这里只是多提供一种思路。

利用Pandas的一些辅助函数进行类型转换

Pandas的astype()函数和复杂的自定函数之间有一个中间段,那就是Pandas的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用(如to_numeric()、to_datetime())。所属组数据列中包含一个非数值,用astype()转换出现了错误,然而用to_numeric()函数处理就优雅很多。

pd.to_numeric(data['所属组'], errors='coerce').fillna(0)

Pandas实现数据类型转换的一些小技巧汇总

可以看到,非数值被替换成0.0了,当然这个填充值是可以选择的,具体文档见
pandas.to_numeric - pandas 0.22.0 documentation

Pandas中的to_datetime()函数可以把单独的year、month、day三列合并成一个单独的时间戳。

pd.to_datetime(data[['day', 'month', 'year']])

Pandas实现数据类型转换的一些小技巧汇总

完成数据列的替换

data['new_date'] = pd.to_datetime(data[['day', 'month', 'year']]) #新产生的一列数据
data['所属组'] = pd.to_numeric(data['所属组'], errors='coerce').fillna(0)

到这里所有的数据列都转换完毕,最终的数据显示:

Pandas实现数据类型转换的一些小技巧汇总

Pandas实现数据类型转换的一些小技巧汇总

在读取数据时就对数据类型进行转换,一步到位

data2 = pd.read_csv("data.csv",
   converters={
    '客户编号': str,
    '2016': convert_currency,
    '2017': convert_currency,
    '增长率': convert_percent,
    '所属组': lambda x: pd.to_numeric(x, errors='coerce'),
    '状态': lambda x: np.where(x == "Y", True, False)
    },
   encoding='gbk')

在这里也体现了使用自定义函数比lambda表达式要方便很多。(大部分情况下lambda还是很简洁的,笔者自己也很喜欢使用)

总结

对数据集进行操作的第一步是确保设置正确的数据类型,然后才能进行数据的分析、可视化等操作,Pandas提供了很多非常方便的函数,有了这些函数那么对数据进行分析将会是很方便的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python获取beautifulphoto随机某图片代码实例
Dec 18 Python
python进阶教程之异常处理
Aug 30 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
Python学习笔记之For循环用法详解
Aug 14 Python
Pytorch之view及view_as使用详解
Dec 31 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 #Python
Python代码缩进和测试模块示例详解
May 07 #Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 #Python
利用python的socket发送http(s)请求方法示例
May 07 #Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 #Python
Python视频爬虫实现下载头条视频功能示例
May 07 #Python
十分钟利用Python制作属于你自己的个性logo
May 07 #Python
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
多重?l件?合查?(一)
2006/10/09 PHP
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
php中大括号作用介绍
2012/03/22 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
django ajax json的实例代码
2018/05/29 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
幼儿园保育员岗位职责
2014/04/13 职场文书
学校教师读书活动总结
2014/07/08 职场文书
催款函怎么写
2015/06/24 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
Python OpenCV形态学运算示例详解
2022/04/07 Python