在上篇教程中,我们介绍了pandas的安装、数据的导入与导出以及删除行列的操作。这次让我们一起研究下在pandas中如何根据指定的条件查找表中数据。

1. 数据准备

  这次,我们使用一张学生成绩表。还是老样子,保存以下内容到文件“期末成绩表.csv”中。

学号,性别,语文,数学,英语
2301001,女,98,76,69
2301002,女,92,78,83
2301003,男,62,85,87
2301004,男,99,73,69
2301005,女,69,64,60
2301006,女,67,95,84
2301007,男,65,83,79
2301008,男,74,93,92
2301009,男,72,98,82
2301010,女,71,84,92
2301011,女,63,67,92
2301012,男,78,97,91
2301013,男,75,79,83
2301014,女,75,91,90
2301015,女,93,92,78
2301016,女,98,82,79
2301017,男,74,96,79
2301018,男,65,60,80

  在处理数据前,大致了解下这张表的内容:这张表共保存了18位学生的成绩信息。第一列是学生的学号,取值从2301001到2301018;第二列是学生的性别,取值为“男”或“女”;最后三列分别是学生的语文、数学和英语成绩。

2. 导入数据和查看

  首先,我们从csv文件中加载数据,并导入为DataFrame:

import pandas as pd

df = pd.read_csv('期末成绩.csv')

  希望你还没有忘记,我们首先导入pandas库,并通过别名pd使用这个库;之后通过read_csv从文件“期末成绩.csv”中导入数据。现在,变量df保存的就是这张表。

  此时如果使用print(df)查看,输出如下:

         学号 性别  语文  数学  英语
0 2301001 女 98 76 69
1 2301002 女 92 78 83
2 2301003 男 62 85 87
3 2301004 男 99 73 69
4 2301005 女 69 64 60
5 2301006 女 67 95 84
6 2301007 男 65 83 79
7 2301008 男 74 93 92
8 2301009 男 72 98 82
9 2301010 女 71 84 92
10 2301011 女 63 67 92
11 2301012 男 78 97 91
12 2301013 男 75 79 83
13 2301014 女 75 91 90
14 2301015 女 93 92 78
15 2301016 女 98 82 79
16 2301017 男 74 96 79
17 2301018 男 65 60 80

  相信你对输出结果应该不会感到意外了吧。上次提到过,最左边的一列是pandas默认添加的行号,但其实在pandas中这一列有更正式的名字——索引,英文名为index. 以后你会了解到,索引不一定是从0开始的整数,我们还可以自行指定其它类型的索引。

  导入一张表后,我们可以查看其索引信息:

df.index

  输出为:

RangeIndex(start=0, stop=18, step=1)

  这里的输出表示索引从0开始(start=0),一直到18但不包括18自身(stop=18),每次间隔1(step). 这种表示方法和Python中的列表切片是一致的,与前面输出中的索引为0~17也是一致的。

  类似地,我们也可以查看其列信息:

df.columns

  输出为:

Index(['学号', '性别', '语文', '数学', '英语'], dtype='object')

  通常,我们处理的表会是一张很大的表,没办法一次性全部查看。此时,我们可以找几行看看,例如表的开头5行或最后3行,pandas提供了相应的功能:

df.head(5)  # 查看前5行
df.tail(3) # 查看后3行

3. 按列查找

  在pandas中,可以通过列名查找某个列,例如查找“性别”这一列:

df['性别']

  输出为:

0     女
1 女
2 男
3 男
4 女
5 女
6 男
7 男
8 男
9 女
10 女
11 男
12 男
13 女
14 女
15 女
16 男
17 男

  第一列是索引,第二列则是“性别”这一列。

  如果需要查找多列呢?我们可以传入一个列表,例如查找“性别”和“学号”这两列:

df[['性别', '学号']]

  输出为:

   性别       学号
0 女 2301001
1 女 2301002
2 男 2301003
3 男 2301004
4 女 2301005
5 女 2301006
6 男 2301007
7 男 2301008
8 男 2301009
9 女 2301010
10 女 2301011
11 男 2301012
12 男 2301013
13 女 2301014
14 女 2301015
15 女 2301016
16 男 2301017
17 男 2301018

4. 按行查找

  如果需要查找某些行呢?这时可以通过索引操作。例如选择索引为2,3,4的行:

df[2:5]

  但是很遗憾,如果只需要索引为2的行,不能直接写作df[2], 需要写作df[2:3]. 我不想对此多做解释,因为这种用法并不常见,多数情况下,我们需要根据表的内容进行选择,例如“找出表中语文成绩高于90的所有行”。

  前面提到过,df['语文']可以选择“语文”这一列,其输出为:

0     98
1 92
2 62
3 99
4 69
5 67
6 65
7 74
8 72
9 71
10 63
11 78
12 75
13 75
14 93
15 98
16 74
17 65
Name: 语文, dtype: int64

  以下语句:

df['语文'] > 90

  的输出为:

0      True
1 True
2 False
3 True
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 True
15 True
16 False
17 False
Name: 语文, dtype: bool

  看出二者有什么差别了吗?如果上面的某一行成绩大于90,那么下面的对应行取值为True; 否则为False. 例如,第0行的语文成绩是98,显然是大于90的,因此下面的第0行取值为True;而第2行的语文成绩是62,显然是不大于90的,因此下面的第2行取值为False.

  类似于df['语文'] > 90这种表达式得到的结果,可以用来选择表中的某些行:只有取值为True的那些行会被选择。例如:

df[df['语文'] > 90]

  输出为:

         学号 性别  语文  数学  英语
0 2301001 女 98 76 69
1 2301002 女 92 78 83
3 2301004 男 99 73 69
14 2301015 女 93 92 78
15 2301016 女 98 82 79

  可以看到,只有语文成绩高于90的行才会被选择。

  我们还可以将多个条件连接起来,使用&表示两个条件都需要满足,使用|表示两个条件至少满足其中一个。下面举几个例子:

例1

  选择语文成绩高于90且数学成绩高于80的所有行:

condition = (df['语文'] > 90) & (df['数学'] > 85)
df[condition]

例2

  选择英语成绩不高于90或数学成绩高于75分的所有行:

condition = (df['英语'] <= 90) | (df['数学'] > 75)
df[condition]

例3

  选择数学成绩高于85的男生或语文成绩高于80的女生:

condition1 = ((df['数学'] > 85) & (df['性别'] == '男'))
condition2 = ((df['语文'] > 80) & (df['性别'] == '女'))
df[condition1 | condition2]

5. 同时查找行和列

  然而,最灵活的查找应该是loc,它可以同时选择某些行和列,用法如下:

XXX.loc[行索引, 列索引]

注意:loc后跟的是方括号,不是圆括号,它不是某个函数。

只要将上文提到的选择行、列的写法,分别写在对应的位置上就好。

  如果使用loc只是为了查找某一列,例如“学号”这一列,需要这样写:

df.loc[:, '学号']

行索引的位置需要使用:占个位置,:表示选择所有的行。

  而使用loc仅查找行时,直接写成df.loc[2:4]这样的形式就好,不需要写成df.loc[2:4, :], 虽然二者的结果是一样的。

  需要特别注意的是,在loc中使用2:4这样的索引切片,末尾的4是包含在内的。请看下面这个例子:

  df[2:4]的输出为:

        学号 性别  语文  数学  英语
2 2301003 男 62 85 87
3 2301004 男 99 73 69

  而df.loc[2:4]的输出为:

        学号 性别  语文  数学  英语
2 2301003 男 62 85 87
3 2301004 男 99 73 69
4 2301005 女 69 64 60

  可以看到,使用df.loc索引行,多了索引为4的一行,这一点请务必注意!当使用习惯后,你可以只使用loc这种用法,因为这种用法最灵活。此外还有iloc等其它的用法,不过loc足以应付绝大多数情况了,感兴趣的朋友可以在pandas的官方文档中找到参考资料。

  最后举几个例子:

例1

  找出语文、数学、英语都高于70分的所有同学的学号:

condition = (df['语文'] > 70) & (df['数学'] > 70) & (df['英语'] > 70)
df.loc[condition, '学号']

例2

  找出数学高于80分的所有同学,查找其学号和性别:

df.loc[df['数学'] > 70, ['学号', '性别']]

6. 小结

  这一次,我们学习了如何查找表中的某些行和某些列,想必大家在日常生活中遇到的最多操作就是查找了吧。以上都是一些很简单的操作,大家学会了吗?如果没太看懂,不用怀疑,必然是因为我写得不好,欢迎大家在评论区提意见。

pandas教程02: 查找表中数据的更多相关文章

  1. MySQL查询数据表中数据记录(包括多表查询)

    MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...

  2. 对lua表中数据按一定格式处理,循环

    function putStartCard(handCard) function dataDeal(array,a,b,c) cclog("进入datadeal=============== ...

  3. CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储

    CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...

  4. 使用Excel表格的记录单功能轻松处理工作表中数据的方法

    使用Excel表格的记录单功能轻松处理工作表中数据的方法 记录单是将一条记录分别存储在同一行的几个单元格中,在同一列中分别存储所有记录的相似信息段.使用记录单功能可以轻松地对工作表中的数据进行查看.查 ...

  5. Oracle 取两个表中数据的交集并集差异集合

    Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要 ...

  6. SqlServer查找表中多余的重复记录

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from ...

  7. Mysql清空表(truncate)与删除表中数据(delete)的区别

    来源:http://blog.is36.com/mysql_difference_of_truncate_and_delete/ 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经 ...

  8. db2删除表中数据

    DB2数据库系统建表后,难免会有将表中数据清空的需求,本文将为您介绍DB2数据库中四种数据删除的方法,供您参考,您可以根据实际情况来进行选择,希望能对有所帮助. 1. 使用 DELETE 语句,即: ...

  9. mysql利用navicat导出表结构和表中数据

    LZ在网上搜索了要如何导出mysql的表结构和表中数据,发现有的方法不好用 记录一下好用的方式: 用navicat打开DB链接后,点击数据库,右击选择转储SQL文件,然后选择结构和数据: 之后弹出新的 ...

  10. pl/sql中误删表中数据并提交恢复办法

    最近在操作表中数据时,删除了表中数据,但是又想恢复,后来查到了官方的一篇文档,发现还蛮有用的,如下: 在pl/sql中运行,select * from A as of TIMESTAMP to_tim ...

随机推荐

  1. AtCoder Beginner Contest 194 Editorial

    A - I Scream 根据 奶脂率 和 乳脂率 判断是何种冰淇淋 int main() { ios_base::sync_with_stdio(false), cin.tie(0); int a, ...

  2. SetFitABSA: 基于 SetFit 的少样本、方面级情感分析

    SetFitABSA 是一种可以有效从文本中检测方面级情感的技术. 方面级情感分析 (Aspect-Based Sentiment Analysis,ABSA) 是一种检测文本中特定方面的情感的任务. ...

  3. Element 动态表头渲染表格

    element 中的table表头动态渲染 https://blog.csdn.net/heixiuheixiu666/article/details/104705024/ Element 动态表头渲 ...

  4. java基础-构建工具mvn-day20

    目录 1. 初识mvn 2. 用maven创建工程 3. maven工程 之间的关系 4. 父子 mvn工程 5. mvn常见的插件 6. tomcat插件 1. 初识mvn mvn是一个项目构建工具 ...

  5. docker 安装 ElasticSearch 和 Kibana 及ik 中文分词器

    本文为博主原创,未经允许不得转载: 1. 使用 docker 下载 elasticsearch  7.6.1 docker pull elasticsearch:7.6.1 2. 启动 elastic ...

  6. maven总结一: 常用命令

    本文为博主原创,未经允许不得转载: maven常用命令: 1. mvn clean  maven清理 2. mvn compile  maven 编译 3. mvn package maven 打包 ...

  7. 【MicroPython] 用 c 添加接口 -- 添加 module

    [来源]https://www.eemaker.com/micropython-add-module.html

  8. idea报错 "cannot access ..."的解决办法

    File -> Invalidate Caches -> Invalidate and Restart

  9. Redis-逻辑库-select

  10. Git-分支-branch-checkout-merge