pandas字符串转数字,Pandas实现数据类型转换的一些小技巧汇总

利用Pandas进行数据分析时,确保使用正确的数据类型是非常重要的,否则可能会导致一些不可预知的错误发生。笔者使用Pandas已经有一段时间了,但是还是会在一些小问题上犯错误,追根溯源发现在对数据进行操作时某些特征列并不是Pandas所能处理的类型。因此本文将讨论一些小技巧如何将Python的基本数据类型转化为Pandas所能处理的数据类型。

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

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

引入实际数据进行分析

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

import numpy as npimport pandas as pddata = pd.read_csv('data.csv', encoding='gbk') #因为数据中含有中文数据data

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

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

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

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

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

客户编号的数据类型是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') #对原始数据进行转换并覆盖原始数据列

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

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

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

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

乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为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)

该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。

如果利用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

结果都相同:

为了转换状态列,可以使用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)

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

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

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

完成数据列的替换

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

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

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

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提供了很多非常方便的函数,有了这些函数那么对数据进行分析将会是很方便的。

pandas 字符串数据类型转换成数字型_studyvcmfc的专栏 ...Pandas 将字符串转换为数字类型 | D栈 - Delft Stackpandas 字符串转换数字_一场pandas与SQL的巅峰大战(三 ...pandas factorize将字符串特征转化为数字特征_很吵请安静 ...pandas 字符串形式的数字,怎么转化为数值型? - 知乎pandas数据处理之 标签列字符转数字_wx740851326的博客 ...数据处理之Pandas中数据类型转换_w_shuo的博客-CSDN ...Pandas数据类型转换的几个小技巧 - 知乎pandas 数据类型转换 - 多一点 - 博客园pandas dataframe 读取csv文件 数据类型转化 字符变成了数字Pandas基础入门(9)Pandas字符串函数和选项自定义pandas数据处理,字符串先拆分再合并为什么我们需要使用Pandas字符串Dtype代替文本数据对象python——pandas.Series.str 字符串操作python替换字符串中的数字,python pandas数字替换数据帧中的字符串Pandas替换科学计数法数字Pandas字符串和文本数据pandas 将个别带万的字符串 转换为float类型或者int类型python中lambda字符串长度_Python:Pandas根据字符串长度过滤字符串数据python中lambda字符串长度_Python:Pandas根据字符串长度过滤字符串数据pandas中的一个单元格的字符串中提取字符串python转化为字符串-python – 将dtype对象转换为字符串Pandaspandas从列中的字符串删除不需要的部分(三种方法)【Python基础】Pandas向量化字符串操作pandas--数据类型转换pandas在某行某列中加字符串,筛选某行某列含字符串pandas中如何从后向前提取字符串10. Pandas字符串处理Python判断字符串是否为数字、浮点数、字母pandas groupby同时计算字符串与数值型的问题Pandas字符串处理(九)#Python 31- Pandas模块-字符串提取数据如何用Python的pandas实现DataFrame列的字符串截取pandas 终极版5: 字符串和缺失值处理Pandas 字符串处理pandas中去除指定字符#Python 32- Pandas模块-匹配字符串pandas的数据类型转换
同维CAD服务兼职招募豆瓣感冒了只有一个鼻孔流鼻涕离岛信息是什么意思什么是室内软装设计软装设计公司简介黄xx儿成语12星座最佳好老公钱币六正位杭州艺术学校多元函数求极限例题二元函数0比0型求极限开源证券股份有限公司2021校园招聘开源证券2022校园招聘艾格联载完了的小说艾格文库牧马人鼠标宏设置不能使用怎么办面对孩子当众撒泼李玫瑾出招笑嫣然txt微盘笑嫣然全文阅读中专生如何留学阳光保险2020年关键词毕业生2020