首页 > 其他分享 >pandas教程02:查找表中数据

pandas教程02:查找表中数据

时间:2023-10-21 16:11:12浏览次数:44  
标签:02 loc 语文 False df 查找 表中 90 pandas

上篇教程中,我们介绍了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. 小结

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

以往写的系列博客都是写到第2篇就夭折了,现在又到了“生死攸关”的时刻,但愿能坚持写下去吧。

标签:02,loc,语文,False,df,查找,表中,90,pandas
From: https://www.cnblogs.com/overxus/p/pandas02.html

相关文章

  • # 20211301 学习笔记6
    20211301郑润芃学习笔记6第三章教材知识总结3.1多任务处理多任务处理:指同时进行几项独立活动的能力单CPU:一次只能执行一个任务多任务处理:通过不同任务之间多路复用CPU的执行时间上下文切换:不同人物之间的执行切换机制并发:逻辑并行性3.2进程的概念进......
  • 20231405寻找你的黑客偶像(选做)
    寻找你的黑客偶像(选做)一.黑客偶像袁仁广别名:大兔子(datuzi),人称袁哥。提起袁任广,知道的人或许并不多。但如果提起袁哥或者大兔子,在国内安全业界称得上尽人皆知。在国内,他的windows系统方面的造诣可谓首屈一指,早在1999年就曾提出过windows的共享漏洞。而现在袁仁广领衔的360漏......
  • 在Postgresql中,为表中的所有点提供100m缓冲区,其中有50M个条目
    我有一个表,有50米的纬度和经度条目,geom是我从QGIS导入时创建的。我试图通过调用jupyter笔记本中的表来为表中的所有点创建一个100m的缓冲区。我还尝试使用SRID:25832转换坐标系,以米为单位表示缓冲区,但在postgresql视图中看不到投影到正确位置的点。SELECT*FROMpublic."opera......
  • PolarD&N2023秋季个人挑战—Crypto全解
    EasyRSA(额。。这个题看错了不是挑战赛的。这里当做好题记录下来了)题目信息:500分5Polar币fromCrypto.Util.numberimportbytes_to_long,long_to_bytes,getPrimeimportgmpy2,osp=getPrime(512)q=getPrime(512)n=p*qe=65537c=pow(flag1,e,n)print(he......
  • The 2021 CCPC Guilin Onsite (XXII Open Cup, Grand Prix of EDG)
    Preface昨天下午16:30~21:30刚打完CCPC2021的广州,今天早上九点又开始打这场桂林,压力拉满了属于是这场比起昨天那场良心太多了,开场还挺顺(虽然因为写Dijkstra偷懒TLE了四发),但开题啥的都是见一个会一个中期虽然有点卡但因为祁神会了几何所以没有空机,然后再点完外卖后我突然顿悟把BK......
  • 面试必刷TOP101:8、链表中倒数最后k个结点
    一、题目输入一个长度为n的链表,设链表中的元素的值为ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为0的链表。二、题解2.1快慢指针第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指......
  • 2023-2024-1 20231317《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第四周作业)这个作业的目标<《C语言程序设计第三章》>作业正文...本博客链接https://www.cnblogs.com/......
  • 2023-2024-1 20231404高伟光 《计算机基础与程序设计》第四周学习总结
    作业信息所属班级计算机基础与程序设计作业要求要求作业目标学习并总结课本,通过测试作业正文本博客教材学习内容总结1.学习了门与电路的相关知识,了解了相关运算与图解2.知道大多计算机为冯-诺伊曼体系3.学习了强转,了解计算机赋值逻辑和晕算符号教材学......
  • 2024秋招记录
    前言本人北京211本硕,Java后端,两段小厂实习,1个外包项目,1个课设项目不定期更新美团基础研发平台美团的面试官我感觉相当nice2023.10.07笔试牛客,5道编程题,可以用IDE模拟,AC模拟,AC好像是贪心来着,AC数学期望,通过3%树,通过6%2023.10.11技术一面2023.10.17技术二面......
  • 2023年金九银十面经,假的今年没有金九银十
    24岁的我选择了裸辞前言说实话选择裸辞后很迷茫,但是又不想在原本的公司上班,目前处于昏昏沉沉的状态,工作也是混一天是一天,没有了什么明确的目标,不知道屏幕前的你们有没有这种感觉,目前想着休息一段时间,可是又不敢休息,钱包不允许。今年的金九银十根本没有,环境确实很差。公司A公司A:第......