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

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

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

pands数据类型

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

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

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

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

本文主要学习pandas的:

  • object

  • int64

  • float64

  • datetime64

  • bool

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

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

import pandas as pd

import numpy as np

df = pd.read_csv('sales_data_types.csv')

df

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

df.dtypes

Customer Number float64

Customer Name object

2016 object

2017 object

Percent Growth object

Jan Units object

Month int64

Day int64

Year int64

Active object

dtype: object

数据中暴露的问题

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

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

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

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

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

  • Active应该是bool型数据

转换数据类型的思路

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

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

  • 使用pandas内置的tonumeric()和todatetime()

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

一、使用astype()方法

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

df['Customer Number'].astype('int')

0 10002

1 552278

2 23477

3 24900

4 651029

Name: Customer Number, dtype: int64

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

df['Customer Number'] = df['Customer Number'].astype('int')

df.dtypes

Customer Number int64

Customer Name object

2016 object

2017 object

Percent Growth object

Jan Units object

Month int64

Day int64

Year int64

Active object

dtype: object

现在我们再看看心的dataframe

df

我们试着将 2016、2017、PercentGrowth、JanUnits列 从 字符串 转化为 数字

df['2016'].astype('int')


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列为例,在强制从字符串转为数字之前,我们需要先将 "$"、"."、"," 剔除掉,然后再转换。

def convert_currency(val):

"""

将字符串val转为一个浮点型数值

- 移除 $

- 去掉 ','、 '.'

- 转为 浮点型数值

"""

new_val = val.replace(',', '').replace('$', '')

return float(new_val)

df['2016'] = df['2016'].apply(convert_currency)

df['2017'] = df['2017'].apply(convert_currency)

df

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

#df['2016'] = df['2016'].apply(lambda x:x.replace('.', '').replace(',', '')).astype('float')

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

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

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

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

def convert_percent(val):

"""

将百分比字符串数据 转为 浮点型数值

- 移除 '%'

- 除以100

"""

new_val = val.replace('%', '')

return float(new_val)/100

df['Percent Growth'] = df['Percent Growth'].apply(convert_percent)

df['Percent Growth']

0 0.30

1 0.10

2 0.25

3 0.04

4 -0.15

Name: Percent Growth, dtype: float64

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

#df['Percent Growth'] = df['Percent Growth'].apply(lambda x: x.replace('%', '')).astype('float')/100

最后我们要将 ActiveY、X 转为 True和False

def convert_active(val):

if val=='Y':

return True

else:

return False

df['Active'] = df['Active'].apply(convert_active)

df['Active']

0 True

1 True

2 True

3 True

4 False

Name: Active, dtype: bool

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

np.where(condition, do1, do2)

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

#df['Active'] = np.where(df['Active']=='Y', True, False)

#df['Active']

三、pandas内置的处理函数

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

errors参数有:

  • raise, errors默认为raise

  • ignore 忽略错误

  • coerce 将错误数据标注为NaN

pd.to_numeric(df['Jan Units'], errors='coerce')

0 500.0

1 700.0

2 125.0

3 75.0

4 NaN

Name: Jan Units, dtype: float64

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

df['Jan Units'] = pd.to_numeric(df['Jan Units'], errors='coerce').fillna(0)

df['Jan Units']

0 500.0

1 700.0

2 125.0

3 75.0

4 0.0

Name: Jan Units, dtype: float64

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

df['Start_Date'] = pd.to_datetime(df[['Month', 'Day', 'Year']])

df

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

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

df2 = pd.read_csv("sales_data_types.csv",

dtype = {'Customer Number': 'int'},

converters={'2016': convert_currency,

'2017': convert_currency,

'Percent Growth': convert_percent,

'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),

'Active': lambda x: True if x=='Y' else False})

df2

df2.dtypes

Customer Number int64

Customer Name object

2016 float64

2017 float64

Percent Growth float64

Jan Units float64

Month int64

Day int64

Year int64

Active bool

dtype: object

总结

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

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

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

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

  • 使用pandas内置的tonumeric()和todatetime()

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

推荐文章

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

pip安装问题解决办法

tabulate:好看的字符串表格库

如何理解pandas中的transform函数

计算社会经济学

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

初学Python常见异常错误

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

一行pandas代码生成哑变量

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

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

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

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

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

datetime数据类型_当pandas遇上数据类型问题相关推荐

  1. datetime数据类型_系统数据类型

    1.整数型 1. 整数型数据由负整数或正整数组成,如-15. 0.5和2509. 整数型数据使用bigint.int, smallint和tinyint数据类型存储.各种类型能存储的数值的范围如下: ...

  2. pandas读取csv某一列_让pandas处理大数据速度变快的三个技巧

    上一篇文章 写的是处理GB级数据时datatable比pandas会更高效,但是datatable使用起来毕竟不如pandas来的顺手.所以今天准备介绍pandas的三个使用技巧来让我们的运行效率提高 ...

  3. 华为平板电脑_当5G遇上平板电脑,华为MatePad Pro 5G带来了什么?

    5G已经来临,科技产品向5G升级已是大势所趋,这更是检验实力的探索之路. 2月24日,华为在巴塞罗那在线发布了一系列新品,其中,华为面向全球推出的5G高端旗舰平板,同时也是全球首款公开发布的5G平板华 ...

  4. php随机数字不重复使等式成立_当随机数遇上量子

    导读 小墨读大学的时候,坊间流传着一段顺口溜,用来描述大学几门特别难学的课,其中有一句:"-随机过程随机过,量子力学量力学...",可见这两门课消耗了多少学子的脑细胞.那么,当&q ...

  5. soap协议_当SOAP遇上REST!一文解读Web服务Web API方法

    当SOAP遇上REST!一文解读eb服务和Web API方法 SOAP和REST,也许您已经很熟悉它们,希望扩展您的知识或获取新的观点.或者,也许您听说过它们,并正在寻求更好的理解.毕竟,SOAP和R ...

  6. excel插入页码_当EXCEL遇上PPT 学做抢手人气王

    几乎每一个职场人的简历中,技能这一栏都会写上"熟练掌握Office". word可以说是最基础无难度的,那么PPT,Excel你就真的会用吗? 11月7-8日,<EXCEL遇 ...

  7. 404未找到是什么意思_为什么老遇上404 not found?你懂的

    文章转载自公众号:一只学霸(bajie203) 昨天晚上 大毛火急火燎地打开了电脑 戴上了耳机 不到两分钟 -- 我们往前一凑 登等 果然是大家最害怕的一幕出现了 学霸在网上冲浪多年 留下的都是美好的 ...

  8. 电脑销售渠道_双十一遇上英雄联盟S10,苏宁游戏装备销售增长258%

    原标题:双十一遇上英雄联盟S10,苏宁游戏装备销售增长258% 11月1日,苏宁易购双十一迎来开门红,全渠道.全品类强势爆发.其中,苏宁3C再次领跑行业,访客数同比增长294%,买家数同比增长132% ...

  9. python迭代数据类型_在大型数据集上自动迭代推断数据类型和最小项大小

    在我的工作领域,我经常得到一个很大的csv文件,根本没有关于内容或格式的信息.我正在尝试开发一个工作流来自动推断列的数据类型以及对象数据类型的最大字符串长度,最终目标是将格式化的数据集存储在HDFSt ...

最新文章

  1. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
  2. Smartforms 设置纸张打印格式
  3. 搜索推荐系统实战:终极奥秘
  4. gin-vue-admin菜单配置教程:父子菜单
  5. python素材库_python的JSON库
  6. 电脑同时安装python2和3_一台电脑上同时安装python2和python3
  7. 一万块是存入支付宝里的余额宝好还是存在微信的零钱通里好?
  8. 动态规划(Dynamic Programming)理论篇
  9. 世纪三部曲(全9册) 读后感
  10. 直播入门(二)从视频采集到客户端播放
  11. 功能测试与项目实战之测试计划(精辟干货)
  12. Swift语言难度大吗?适不适合零基础学习?
  13. 学习 HTTP Referer
  14. 遍历HashMap中元素的三种方法
  15. C语言单链表 看不懂temp->next = book; book->next =NULL;
  16. uniapp 埋点(友盟)
  17. python宝典 宋强 pdf_Python宝典
  18. Ubuntu系统下OpenCV使用实例(虚拟机获取摄像头权限)
  19. Vue SSR 从入门到 Case Study
  20. linux下oracle11G DG搭建(三):围绕备库搭建操作

热门文章

  1. iptables转发基础
  2. 多网卡Iptables端口转发
  3. Mac/Linux使用fcrackzip
  4. IDA保存修改的寄存器值
  5. Mac串口工具picocom
  6. VALSE学习(十五):网络搜索结构-NAS
  7. 解决OpenCV编译时./bin: error while loading shared libraries: libopencv_highgui.so.3.2: cannot open的问题
  8. linux on android 项目,好累,终于完成了 Android-on-Yeeloong 项目的搭建
  9. android如何展示富文本_Android中如何在textView实现富文本
  10. linux shell 后台执行脚本的方法 脚本后台运行 后台运行程