数据治理 | 数据分析与清洗工具:Pandas 数据类型转换(赠送本文同款数据!!)

查看原文:【数据seminar】数据治理 | 数据分析与清洗工具:Pandas 数据类型转换(赠送本文同款数据!!)

我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系(详情见文末)。

目录:

一、前言

二、为什么需要做数据类型转换

三、类型转换

  1. 使用 astype() 转换基本类型

    • 场景 1:将数据中的年份字段转换为整数型。

    • 场景 2:将数据中所有内容转换为字符型数据。转换后的数据命名为 ALL_STR

  2. 使用 eval() 转换特殊类型

    • 场景 3:将数据中“列表”字段转换为 Python 列表类型

四、总结

💡 本文所用数据为:【5G 产业全国各省市分年度专利申请、专利授权情况(2000-2019.9)】

💡 数据获取方式:关注公众号【数据seminar】,后台回复关键词“20220402”即可获取

Part 1  前言

上期文章中,我们介绍了数据中的各种类型的缺失值以及如何处理这些缺失值;同时也介绍了常见的数据重复问题并奉上了处理重复数据的方法。这些处理方法对大家的数据治理、数据分析工作都有着至关重要的作用。本期文章将会继续学习 Pandas 工具,学习如何转换数据类型。读完本文后,灵活转换数据类型将不再是问题!

本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 编写。

Part 2  为什么需要做数据类型转换

数据的含义与数据的类型是息息相关的,正确的数据类型能够支撑数据含义的正确表示。当一些数据的类型出现错乱时,它们的含义也会变得“诡异”。请看下面几个例子:

错误示范正确示范原因解析

今年是 2022.0 年

今年是 2022 年

2022 作为一个年份时,应该保存为整数型或者字符型,而不是浮点型(小数型)数字 2022.0

圆周率保留两位小数的结果是 3

圆周率保留两位小数的结果是 3.14

圆周率保留两位小数应该是浮点数 3.14,如果转为整数型,其结果就会是 3

1 + 1 = 11

1 + 1 = 2

1 + 1 = 11 实际上是字符串拼接,即 '1' + '1' 得到了 '11' 

[0, 1, 2] 的第一个元素是 [

[0, 1, 2] 的第一个元素是 0

列表 [0, 1, 2] 被保存为字符型,它的真面目是 "[0, 1, 2]",这个字符串的第一个元素是 '[' 而不是 0

我们早已经知道,Python 中字符串是用英文引号引起来的,就像是 'Python',"Python"。你可能会觉得,既然如此,数字型数据和字符型数据不就不容易搞混了吗?例如,数字 2022 和 字符串 "2022" ,很容易就能区分。然而,实际的情况却是,容易搞混,很容易搞混!这是因为在 Pandas 中,所有字符数据前后的引号都不会显示出来,如果显示出了引号,那么这些引号也是字符串中的字符。所以使用 Pandas 处理数据,为了避免类似的情况出现,学习数据类型转换是非常有必要的。

Part 3  类型转换

大多数时候,数据中不同字段的数据类型是不一定全都一样;同一个字段中,数据的类型是一般是一致的。所以进行数据类型转换时不需要一个一个对数据值做类型转换,直接操作一个字段会更加方便。

我们使用本期赠送的数据作为介绍 Pandas 的示例数据,使用 Excel 打开数据【5G 产业全国各省市分年度专利申请、专利授权情况(2000-2019.9).xlsx】,如下图所示:

赠送的数据中没有缺失值,其中值为数字的字段在 Excel 中是数字类型;我们使用 Pandas 读取 Excel 或者 csv 数据时,系统会自动地将每个字段读取为合适的数据类型。如果需要自定义一些(或者所有)字段的类型,我们也可以自己指定每个字段的数据类型(数据必须满足指定类型的格式,例如我们不可以将 “省份名” 字段设置为 整数型)。使用 Pandas 读取这个 Excel 数据,代码和输出如下:

# 数据存储的路径
path = './5G 产业全国各省市分年度专利申请、专利授权情况(2000-2019.9).xlsx'
# 这里指定字段的数据类型
columns_type = {'年份':'str', 
                '省份名':'str', 
                '省份行政代码':'int',                                 
                '专利申请':'int', 
                '专利授权':'int', 
                '专利类型':'str'}
# dtype 参数用于指定字段的类型,如果不需要特意指定字段的类型,不使用 dtype 参数即可
data = pd.read_excel(path, dtype=columns_type)
data

  

读取数据后我们使用 Pandas 中的相关方法生成一个新的列,这一列中的数据是一个包含专利申请专利授权专利类型的列表。操作代码和新生成的数据如下:

# 根据专利申请、专利授权和专利类型三个字段得到一个新字段
data['列表'] = data.apply(lambda X: [X['专利申请'], X['专利授权'], X['专利类型']] ,axis=1)
data

   

将新生成的数据保存为 csv 文件后再读取,读取时我们故意将部分字段读取为错误的类型,随后使用错误的数据来给大家演示如何进行数据类型的转换。

# 将刚刚新生成的数据保存为 csv 文件
# 参数 index=False 的含义是,不讲数据索引写入 csv 文件中
data.to_csv('新数据.csv', index=False)

# 使用错误的字段类型重新读取数据
# 我们将年份读取为浮点型(小数型),将专利申请读取为字符型
wrong_type = {'年份':'float',                                   
              '专利申请':'str'}
DATA = pd.read_csv('新数据.csv', dtype=wrong_type)

# 查看专利申请字段类型
print(DATA.专利申请.dtype)  # 输出:object,说明该字段含有字符型数据
DATA

  

可以看到,“年份” 字段中所有的年份都变为小数型;通过代码也判断出 “专利申请” 字段不再是整数型,而是字符型,因为 DataFrame 中的字符型数据不会显示两端的引号,所以无法目测其类型。那么这种内容为数字的字符型数据会给我们什么麻烦呢?假设我们需要使用 专利授权专利申请 来计算专利授权率时 ,会发现整数和字符之间无法运算。如果这两个字段中的值的都是字符型,那么两者只能进行加法运算,例如:“45” + “8” == “458”,这恐怕更不是我们想要的结果。

接下来我们使用数据类型转换的方法来纠正这些错误的数据。

1、使用 astype() 转换基本类型

Pandas 专门为类型转换提供了一个 astype() 方法,这个方法可以将数据类型转换为希望的类型,既可以操作 Series,又可以操作 DataFrame,使用时只需要传入转换后的类型即可。我们在往期的文章中提到过,Pandas 中绝大多数涉及到数据修改的方法,他们都不会直接修改原始的数据,而是返回一个新的数据astype()也是一样的,默认返回一个新的数据。

场景 1:将数据中的年份字段转换为整数型

# 将字段类型由浮点型(小数型)转换为整数型 int
# 返回一个新数据,调用该方法的是一个 Series,返回值也将是一个 Series
DATA['年份'].astype(int)

   

希望类型转换操作在原始数据中生效可以使用下面的代码。

# 将新生的数据重新赋值给原始数据即可
# 赋值操作不会返回任何值
DATA['年份'] = DATA['年份'].astype(int)
# 输出查看转换后的数据
DATA

   

场景 2:将数据中所有内容转换为字符型数据,转换后的数据命名为 ALL_STR

# 将类型转换为字符型数据后的新数据命名为 ALL_STR
ALL_STR = DATA.astype(str)
# 查看新数据的信息
ALL_STR.info()

  

所有的字段类型都变为 object,说明所有字段中都含有字符型数据,操作生效。

另外,当字段中存在无法转换的数据值时,可以指定参数 errors='ignore' 来忽略无法转换的数据值。假如我们希望将所有字段都转换为浮点型(小数型),但是字符型数据 “北京” 、“45”、“发明专利” 等字符型数据无法转换为浮点型,我们则可以使用下面的代码来转换可以转换的字段:

# 指定参数 errors='ignore',忽略无法转换的数据值
DATA.astype(float, errors='ignore')

   

可以看到,除了一些字符型数据之外,其他的数字类型数据都被转换为浮点型(小数型)数据。同样地,如果不进行赋值操作,那么就会返回一个新的数据,而原始数据不会发生变化。

2、使用 eval() 转换特殊类型

astype() 方法多用于浮点型 float、整数型 int 和 字符型 str 的转换操作。当涉及到字符型转化为列表,字典等 Python 的组合数据类型时,则需要使用 Python 自带的方法 eval() 。该函数可以去掉字符串最外侧的引号,并按照 Python 语句方式执行去掉引号后的字符内容。下面我们举例介绍一下 eval() 的用法。

# 对字符串 '12' 做转换
eval('12')     # 得到整数:12

# 对字符串 '12.5' 做转换
eval('12.5')   # 得到浮点数:12.5

# 对字符串 '12+5' 做转换
eval('12+5')   # 得到整数:17

# 定义变量 a 后对字符串 'a' 做转换
a = '20'
eval('a')      # 得到 a 的值:20

# 对字符串 "[11,12,'列表元素']" 做转换
eval("[11,12,'列表元素']") # 得到列表:[11, 12, '列表元素']

# 定义变量 m,n 后对字符串 '[m,n,m-50]' 做转换
m=100
n='某个字符串'
eval("[m,n,m-50]")  # 得到列表:[100, '某个字符串', 50]

根据上面的例子可以看出,eval() 确实可以去掉字符串最外侧的引号,并按照 Python 语句方式执行去掉引号后的字符内容。这个方法不仅可以转换列表形式的字符串,对诸如字典、元组以及集合等 Python 数据类型形式的字符串,该方法依然可用。

场景 3:将数据中“列表”字段转换为 Python 列表类型

由于 eval() 方法操作的是字符串对象,一次只接受一个需要转化的对象,当需要使用它来对 DataFrame 的一整个字段做转换操作时,需要借助循环或者其他的 Pandas 方法。

# 输出查看转换之前"列表"字段最后一个值的类型,原始的类型为 str 型
print(type(DATA['列表'].values[-1]))
# 输出:<class 'str'>,确认是字符型

# 方法 1:借助 for 循环
for i in DATA.index:
    # 遍历数据的索引
    # 根据索引找到待转换的数据
    Target = DATA.loc[i,'列表']
    # 将转换后的数据重新赋值给原来位置的数据值
    DATA['列表'][i] = eval(Target)
    
# 输出查看"列表"字段最后一个值的类型,若为列表,说明转换成功
print(type(DATA['列表'].values[-1]))
# 输出:<class 'list'>,转换成功

# 方法 2:借助 Pandas 方法 map()。不再输出查看类型
DATA['列表'] = DATA['列表'].map(eval)

# 方法 3:借助 Pandas 方法 apply()。不再输出查看类型
DATA['列表'] = DATA['列表'].apply(eval)

后面两种方法可以实现 方法 1 同样的效果,且代码量更少。

Part 4  总结

本期文章中,我们介绍了数据类型错误带来的影响,同时也介绍了转换字段数据类型的方法。使用类型转换方法可以在基本的数据类型之间进行合理的转换。同时也介绍了转换特殊数据类型的方法。学习这些可以让我们灵活地转换数据的类型,避免类型错乱带来的麻烦。

在最后的 场景3中,我们使用了map() 和 apply() 两个方法,使用更少的代码完成了同样的功能。下期文章我们将会继续介绍 Pandas,学习如何使用以上两种方法来根据已有的数据生成新的数据列(数据列衍生)。

我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块:

1. 计算机基础知识

(1) 社科研究软硬件体系搭建——虚拟化技术概述与实践

2. 编程基础

(1) 数据治理 | 带你学Python之 环境搭建与基础数据类型介绍篇

(2) 数据治理 | 带你学Python之控制结构与函数

(3) 数据治理 | 带你学Python之面向对象编程基础

(4) 数据治理 | 还在用Excel做数据分析呢?SQL它不香吗

(5) 数据治理 | 普通社科人如何学习SQL?一篇文章给您说明白

(6) 数据治理 |  如何实现SQL数据库的横向匹配

3. 数据采集

(1) 数据治理 | 快速get数据采集技能:理论知识篇

(2) 数据治理 | 数据采集实战:静态网页数据采集

(3) 数据治理 | 数据采集实战:动态网页数据采集

4. 数据存储

(1) 安装篇:数据治理 | 遇到海量数据stata卡死怎么办?这一数据处理利器要掌握

(2) 管理篇: 数据治理 | 多人协同处理数据担心不安全?学会这一招,轻松管理你的数据团队

(3) 数据导入:数据治理 | “把大象装进冰箱的第二步”:海量微观数据如何“塞进”数据库?

(4) 数据治理|Stata如何直连关系型数据库

5. 数据清洗

(1) 数据治理 | 数据清洗必备 — 正则表达式

(2) 数据治理 | 数据分析与清洗工具:Pandas基础

(3) 数据治理 | 数据分析与清洗工具:Pandas数据选取与修改

(4) 数据治理 | 数据分析与清洗工具:用Pandas快速选出你的“心之所向”

(5) 数据治理 | 数据分析与清洗工具:Pandas缺失值与重复值处理

(6) 本期内容:数据治理 | 数据分析与清洗工具:Pandas 数据类型转换

6. 数据实验室搭建

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值