其他
数据治理 | 数据分析与清洗工具:用Pandas快速选出你的“心之所向”
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系(详情见文末)。
Part1前言
loc
与iloc
,使用这两个方法,我们可以使用Pandas 中 DataFrame 类型数据的行索引,列名称或者行序号和列序号来准确的选取数据。本期文章我们将介绍 Pandas 中的数据条件筛选方法,学完这一部分知识,我们将可以根据数据内容来选取符合条件的数据。注:本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 中编写;所有 SQL 代码在数据库工具 DBeaver 中编写和运行。
Part2Pandas 条件筛选方法
Industry
,在数据库中的表名称则是"工业数据信息
",数据量为 336768 行,8 列;图中只截取了一部分数据,下同。第一种是使用数据筛选方法 pd.DataFrame.query()
,第二种是使用条件表达式来筛选数据。
# 第一种: 使用 query 方法
Industry.query('行业门类名称 == "制造业"')
# 第二种: 使用条件表达式
Industry[Industry['行业门类名称'] == '制造业']
Part3单条件筛选
场景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 中的对应符号分别是and
、or
、not
。这种逻辑符号在 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总结 & 预告
1. 计算机基础知识
2. 编程基础
(1) 数据治理 | 带你学Python之 环境搭建与基础数据类型介绍篇
(4) 数据治理 | 还在用Excel做数据分析呢?SQL它不香吗
(5) 数据治理 | 普通社科人如何学习SQL?一篇文章给您说明白
3. 数据采集
4. 数据存储
(1) 安装篇:数据治理 | 遇到海量数据stata卡死怎么办?这一数据处理利器要掌握
(2) 管理篇: 数据治理 | 多人协同处理数据担心不安全?学会这一招,轻松管理你的数据团队
(3) 数据导入:数据治理 | “把大象装进冰箱的第二步”:海量微观数据如何“塞进”数据库?
5. 数据清洗
(3) 数据治理 | 数据分析与清洗工具:Pandas数据选取与修改
(4) 本期内容: 数据治理 | 数据分析与清洗工具:用Pandas快速选出你的“心之所向”
6. 数据实验室搭建
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 《社科领域大数据治理实务手册》
欢迎扫描👇二维码添加关注