pandas教程02: 查找表中数据
上一节介绍了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. 查看表格信息
从文件中导入数据:
import pandas as pd
df = pd.read_csv('期末成绩.csv')
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默认添加的行号,它的正式名称为索引(index). 以后你会了解到,索引不一定是从0开始的整数,可以自行指定其它类型的索引。
查看表的索引信息:
df.index
输出如下:
RangeIndex(start=0, stop=18, step=1)
表示索引从0开始(start=0),一直到18但不包括18自身(stop=18),每次间隔1(step=1),与Python切片的使用方法一致。
类似地,也可以查看表格的列:
df.columns
输出如下:
Index(['学号', '性别', '语文', '数学', '英语'], dtype='object')
有时候,处理的表格很大,无法一次性查看。这时,可以从表格中找几行看看,例如查看表的头5行或最后3行:
df.head(5) # 查看前5行
df.tail(3) # 查看后3行
3. 按列查找
可以通过列名查找列。例如查找“性别”这一列:
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这一行,这一点请务必注意!此外还有iloc等其它的用法,不过loc足以应付绝大多数情况了,可以在pandas官方文档中找到参考资料。
最后举几个例子:
例1:找出语文、数学、英语都高于70分的所有同学的学号:
condition = (df['语文'] > 70) & (df['数学'] > 70) & (df['英语'] > 70)
df.loc[condition, '学号']
例2:找出数学高于80分的所有同学,查找其学号和性别:
df.loc[df['数学'] > 70, ['学号', '性别']]

pandas中DataFrame的基本查找操作:如何根据指定的条件,查找表中的某些行和某些列。
浙公网安备 33010602011771号