查看原文
其他

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

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

Part1前言

上期文章中,我们介绍了数据选取的两个常用方法lociloc,使用这两个方法,我们可以使用Pandas 中 DataFrame 类型数据的行索引,列名称或者行序号和列序号来准确的选取数据。本期文章我们将介绍 Pandas 中的数据条件筛选方法,学完这一部分知识,我们将可以根据数据内容来选取符合条件的数据
在【数据治理】系列文章的第二部分,我们学习了数据库(MySQL)的知识,并使用数据库语言的数据筛选方式与 Excel 数据筛选方式做了一些对比。而在本文中,我们将会用 Pandas 中的数据筛选方法和数据库筛选方法做对比,并使用某年统计的中国工业企业数据,展示如何使用 Pandas 快捷地进行数据筛选。
注:本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 中编写;所有 SQL 代码在数据库工具 DBeaver 中编写和运行。

Part2Pandas 条件筛选方法

开始介绍之前不妨先温故一下什么是数据筛选。在实际的工作学习中,我们有很多时候需要根据数据的内容来选取数据而不是数据的索引或者序号。打个比方,有一张表统计一个班级所有学生的期中考试成绩,而你就是班主任。你想要约所有数学考试不及格的同学来你的办公室喝茶,可是如果根据成绩一个一个来用眼睛来看的话,工作效率不是很高,而且很容易出现漏网之鱼!这时我们就可以使用代码来进行筛选,就能够快速且精准地找到需要找的同学。除此之外,也可以找到所有王姓同学;所有缺考的同学(成绩为空)等等。这种根据数据内容,通过设置条件来查找数据的操作就可以称之为条件筛选。
某年统计的工业企业的数据如下图所示,下面的介绍中,我们将使用这份数据进行条件筛选的演示。为了方便对比 SQL 与 Pandas,这份数据在 Python 中的变量名称是Industry,在数据库中的表名称则是"工业数据信息",数据量为 336768 行,8 列;图中只截取了一部分数据,下同。
在 Pandas 的 DataFrame 中主要有两种方式可以根据条件来筛选数据的方式。
第一种是使用数据筛选方法pd.DataFrame.query(),第二种是使用条件表达式来筛选数据。
例如:筛选工业数据中行业门类是"制造业"的所有数据。
# 第一种: 使用 query 方法
Industry.query('行业门类名称 == "制造业"')

# 第二种: 使用条件表达式
Industry[Industry['行业门类名称'] == '制造业']
以上这两种方法得到的结果完全一样,所得结果如下图,数据类型为 DataFrame。为了方便查看,只截取了部分行和列,下同

Part3单条件筛选

上面的例子中,我们使用了一个简单的例子介绍了两种数据筛选方式,在 Pandas 中,我们不仅可以使用相等作为条件进行筛选,还可以使用基本的比较运算符和字符串的子串来筛选数据。下面将与 SQL 语言对比,介绍 Pandas 如何筛选数据。本节将只介绍单个筛选条件的数据筛选方式

场景1筛选出资产在 1000 万元及以上的所有企业

MySQL

select * 
from industry.工业企业信息
where `资产总计(万元)` >= 1000
 

Pandas

注意:使用 query 方法,当列名称中出现空格,英文括号等特殊字符时,需要使用反引号引起来,如 `资产总计(万元)`
# 使用 query 方法,当列名称中出现空格,英文括号等特殊字符时
# 需要使用反引号引起来,如 `资产总计(万元)`
Industry.query('`资产总计(万元)` >= 1000')

# 使用条件表达式
Industry[Industry['资产总计(万元)'] >= 1000]
两种方法所得结果完全一样:

场景2筛选出行业大类名称中包含“橡胶”两个字的所有企业

MySQL

select * from industry.工业企业信息
where 行业大类名称 like '%橡胶%'
 

Pandas

# query 方法在这种使用场景下无法筛选,这里只使用条件表达式来做筛选
Industry[Industry['行业大类名称'].str.contains('橡胶')]
 
Series.str.contains()可以判断 Series 中的元素值是否含有目标字符,前提是元素值的数据类型必须是字符型。需要注意的是,这里的 contains() 并不是简单的包含,这个方法是以正则表达式为基础实现的,也就是说我们可以像写正则表达式一样来筛选字符型数据;同时,判断是否包含字符时也需要注意正则表达式中的特殊字符“.”“*”“\”等特殊字符,必要时需要在前面加上一个转义符“\”

场景3筛选出行业大类名称中不包含“金属”两个字的所有企业

MySQL

select * from industry.工业企业信息
where 行业大类名称 not like '%金属%'
 

Pandas

当设置一个条件,我们希望筛选不满足这个条件的数据,而不是满足这个条件的数据时,可以使用逻辑非,即取反。这种取反操作在条件表达式中极易实现,只需要在条件前面加上一个波浪符  ~ 
# query 方法仍然不适用于这种方法,这里只使用条件表达式
# 只需要在条件前面加上一个波浪符 '~',就表示取反
Industry[~Industry['行业大类名称'].str.contains('金属')]
 

场景4筛选出负债资产大于总资产的所有企业

MySQL

select * from industry.工业企业信息
where `负债资产(万元)` > `资产总计(万元)`
 

Pandas

# 使用 query 方法
Industry.query('`负债资产(万元)` > `资产总计(万元)`')

# 使用 条件表达式
Industry[Industry['负债资产(万元)'] > Industry['资产总计(万元)']]
 
在单个条件的筛选中,除了以上几种筛选,还可以使用其他的运算符来实现筛选,比如不等于(!=)、大于等于(>=)、加减乘除后再比较等等。

Part4多条件筛选

在上一部分单条件筛选中,我们介绍了条件筛选的条件如何来写,下面将会介绍如何同时使用多个条件来筛选数据。当存在多个条件时,往往要考虑到它们之间的逻辑关系。在 Python 中,常见的逻辑关系主要是“与”“或”“非”;他们在 Python 中的对应符号分别是andornot。这种逻辑符号在 query 方法中依然适用,但是在逻辑表达式写法中,则应该使用&|~这三个符号,其中逻辑非(取反)已经在场景3中使用过。
下面来使用这些关系符号进行数据查询。

场景5筛选出2000 年成立且总资产在 5000 万元及以上的企业名称及其所属行业门类名称

MySQL

select 企业名称,行业门类名称 from industry.工业企业信息
where 成立年份 = '2000' and `资产总计(万元)` >= 5000
 

Pandas

当筛选条件不止一个时,不论是使用 query 方法,还是使用条件表达式,都需要使用括号将每一个条件括起来。这样做不仅使代码逻辑清晰,还避免了许多程序报错。
# 使用 query 方法, 推荐以下三种写法中的第三种
# 即使用括号将每一个条件括起来,这样会更加清楚,方便阅读
Industry.query('成立年份 == "2000" & `资产总计(万元)` >= 5000') [['企业名称','行业门类名称']]
Industry.query('成立年份 == "2000" and `资产总计(万元)` >= 5000') [['企业名称','行业门类名称']]
Industry.query('(成立年份 == "2000") & (`资产总计(万元)` >= 5000)') [['企业名称','行业门类名称']]

# 使用条件表达式
# 只能使用 & 来连接,且每个条件必须使用括号括起来
Industry[(Industry['成立年份'] == '2000') & (Industry['资产总计(万元)'] >= 5000)][['企业名称','行业门类名称']]
 

场景6筛选出工业数据中企业名称不含"有限公司",或者行业门类不涉及制造业的所有企业

MySQL

select * from industry.工业企业信息
where 企业名称 not like '%有限公司%' or 行业门类名称 != '制造业'
  

Pandas

# 注意,条件取反时,需要在条件之前加上 '~',逻辑或用符号 "|" 连接
Industry[(~Industry['企业名称'].str.contains('有限公司'))
       | (Industry['行业门类名称'] != '制造业')]
  

Part5总结 & 预告

本期文章我们介绍了如何使用 Pandas 像使用数据库一样,快速地根据条件筛选数据。这其中有许多代码比数据库语言更加直观;比 Excel 更加方便,相信大家读完本文后会有不小的收获。
下期文章我们将继续为大家介绍 Pandas,学习如何使用 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快速选出你的“心之所向”

6. 数据实验室搭建







数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 《社科领域大数据治理实务手册》


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存