44

当pandas遇上数据类型问题

 4 years ago
source link: https://www.tuicool.com/articles/RZR3Ejy
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

原文:Overview of Pandas Data Types 作者 :Chris Moffitt 链接 : https://pbpython.com/pandas_dtypes.html 译者 : 大邓

aMfIZjU.jpg!web

当我们做数据分析时,确保自己使用的是正确的数据类型,这一点很重要。而在pandas中,一般情况下会根据我们导入的数据,自动分配最合适的数据类型。

但是有时候pandas也会犯错,这时候我们就需要diy自定义数据类型。本文主要将pandas的dtype,如何进行数据类型的操作。

pands数据类型

数据类型是编程语言的基础性概念,ta会告诉电脑如何存储数据、如何操作数据。

例如,当我们给程序两个数字,进行 5+10 操作时, 程序要能理解这是两个整数,且知道整数是可以进行加法操作。

而当有两个字符串,进行 "cat"+"hat" 我们知道会得到 cathat

现在可能大家有点疑惑,python、pandas、numpy代表着数据分析领域三大数据类型门派,彼此会有重合,导致各位看官学杂学邪,走火入魔。我列一个表格,以作区分。

yeeieie.png!web

本文主要学习pandas的:

  • object

  • int64

  • float64

  • datetime64

  • bool

为什么这么在意数据类型?

一般情况我们都不会去想数据类型问题,直到发现问题出现了。

bEjmiu3.png!web

一打眼看这结果,我就发现一个问题。 Customer number 应该是整数,不应该带有小数点(浮点型数字)。2016和2017是字符串,但是如果后续对2016和2017列进行数值计算,肯定不行,所以也应该转换成数字型数据。看来问题还是有不少对,那么我们看看所有字段的数据类型

数据中暴露的问题

现在我们可以总结下这个数据有哪些问题:

  • Customer number应该是int64,不应该是float64

  • 2016和2017两个字段是object字符串,但我们应该将其转换为float64或者int64

  • Percent Growth应该是数字,但是这里是object字符串

  • Year、Month、Day三个字段应该合并为一个datetime类型的日期数据

  • Active应该是bool型数据

转换数据类型的思路

  • 使用astype()方法强制转化dtype

  • 自定义一个数据转换函数函数

  • 使用pandas内置的to numeric()和to datetime()

  • 导入数据时转换数据类型

一、使用astype()方法

处理pandas数据类型最简单的办法是astype(),例如,我们将 Customer Number 转为整数型数据。

为了将原始数据更改,我们需要进行原地操作,将处理结果更新到原始数据中来

现在我们再看看心的dataframe

iIBrqmm.png!web

我们试着将 20162017PercentGrowthJanUnits 从 字符串 转化为 数字

ValueError Traceback (most recent call last) in ----> 1 df['2016'].astype('int') ... ValueError: invalid literal for int() with base 10: '$125,000.00'

同样的问题出现在2017、Percent Growth、Jan Units列, 说明astype这种方法不是万能的,还是需要设计自定义转换函数,具体问题具体处理。

二、自定义转换函数

这里我们以 2016和2017列为例,在强制从字符串转为数字之前,我们需要先将 "$"".""," 剔除掉,然后再转换。

eMNvmiy.png!web

可能有的人会说用 lambda 一行代码就能解决的事儿

上面这一样确实能一行搞定,但是我不推荐,原因有:

  • 对于初学者不友好,你写的能看懂,但不代表其他人能看懂你的代码

  • 如果要处理的字段比较多,我们可以多次调用自定义函数。比如定义好以后,在2016和2017上调用

下面我们再用自定义方法处理 PercentGrowth

如果你还是想用lambda处理 PercentGrowth , 那么处理方法如下

最后我们要将 ActiveYX 转为 TrueFalse

这里我们不自定义函数,也可以用numpy中的np.where函数

np.where(condition, do1, do2)

如果condition满足条件,执行do1,否则执行do2

三、pandas内置的处理函数

pandas还有 pd.to_numeric(arg,errors='raise')和pd.to_datetime(arg,errors='raise') 函数帮助我们转为数据类型。

errors参数有:

  • raise, errors默认为raise

  • ignore 忽略错误

  • coerce 将错误数据标注为NaN

我们将处理结果中的NaN用0替代

最后一个要转换的是日期数据,我们要把 YearMonthDay 三列数据 转化 为一个日期数据型新列

3qM7Fr2.png!web

四、导入数据时转换数据类型

除了上面的三种方法,实际上我们也可以在导入数据的时候就处理好。

r2uA7nN.png!web

总结

做数据分析时,我们要确保数据类型是正常的,这要求我们导入数据后就要检查数据类型。

如果数据类型不满足我们的需求,需要转换数据类型,思路有

  • 使用astype()方法强制转化dtype

  • 自定义一个数据转换函数函数

  • 使用pandas内置的to numeric()和to datetime()

  • 导入数据时转换数据类型

推荐文章

python爬虫与文本数据分析 系列课

pip安装问题解决办法

tabulate:好看的字符串表格库

如何理解pandas中的transform函数

计算社会经济学

免费视频课《Python快速入门》

初学Python常见异常错误

Python 函数式编程指北,不只是面向对象哦

一行pandas代码生成哑变量

顺利开班 | python爬虫分析2019年杭州国庆工作坊顺利开班

圆满落幕 | Python 爬虫分析杭州国庆工作坊圆满落幕

文本数据分析文章汇总(2016-至今)

课件获取方式,请在公众号后台回复关键词“ pandas真香 ”,

其实我想用“大邓真帅” 这个关键词:smile:,你们还能想到哪些关键词,欢迎留言~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK