当涉及数据处理和分析时,Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法,使得数据的选择、筛选和处理变得简单而高效。在本博客中,我们将重点介绍Pandas中数据筛选的关键知识点,包括条件索引、逻辑操作符、query()
方法以及其他一些常用技巧~
在Python和Pandas库中,索引是一种用于标识和访问数据的重要概念。索引可以是整数、标签、日期等类型,它允许我们按照指定的标记来查找、选择和操作数据。本文重点介绍的是Pandas中的筛选操作,我们先来简单回顾一下Python中一些筛选的相关操作。
在Python中列表、元组、字符串、字典都是支持索引的数据结构。索引从0开始,表示数据元素在序列中的位置。
例如,对于列表可以通过list[0]来访问列表的一个元素
In[0]:
list_filter = [1,2,3,4,5]
print(list_filter[0])
print(list_filter[1])
out[0]:
1
2
In[1]:
string_filter = "hello"
print(string_filter[0])
print(string_filter[1])
out[1]:
h
e
对于元组亦是如此
In[2]:
tuple_filter = (1, 2, 3, 4)
print(tuple_filter[0])
print(tuple_filter[2])
out[2]:
1
3
对于字典则是可以通过’‘键’'来索引字典中的值
In[3]:
dict_filter = {'1': 'one', '2': 'two', '3': 'three'}
print(dict_filter['1'])
print(dict_filter['2'])
out[3]:
one
two
除此之外你也可以通过切片索引、负数索引来进行筛选操作在此就不在赘述了
案例数据表university_rank.csv
df.iloc
是Pandas中用于整数位置索引(Integer Location Indexing)的一种属性,用于访问DataFrame或Series中的数据。iloc
允许你使用整数位置来选择特定的行和列,类似于Python中的列表索引。
语法 df.iloc[row_index, column_index]
其中的row_index和column_index可以是单个整数、切片或者列表
我们先来尝试一下整行筛选
df.iloc[
,这里需要注意的是end_loc
是取不到的,比如df.iloc[0:2]
,从0开始,只能取到0,1。
In[4]:
import pandas as pd
df = pd.read_csv("university_rank.csv") # 读取案例数据表
df # 展示数据表,跟print一样的作用
out[4]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
2 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
3 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
... | ... | ... | ... | ... | ... |
95 | 圣保罗国立大学 | 96 | 南美 | 计算机科学 | 研究生录取率 |
96 | 约翰内斯堡大学 | 97 | 非洲 | 环境科学 | 学术声誉 |
97 | 麦吉尔大学 | 98 | 北美 | 艺术 | 学生满意度 |
98 | 伦敦政治经济学院 | 99 | 欧洲 | 法律 | 国际影响力 |
99 | 东京大学 | 100 | 亚洲 | 教育 | 毕业生就业率 |
100 rows × 5 columns
In[5]:
df.iloc[0:2] # 对案例数据表进行整行筛选
out[5]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
行能切边,那列能不能切片呢?答案当然是能,只需要用’ , '来分割行列之间的索引即可。
In[6]:
df.iloc[0:2, 0:3]
out[6]:
大学名称 | 排名 | 地区 | |
---|---|---|---|
0 | 哈佛大学 | 1 | 北美 |
1 | 牛津大学 | 2 | 欧洲 |
补充:我们知道在Pandas中不仅有DataFrame还有Series,在Series中我们也可以使用df.iloc[index]
来进行索引,其中index可以是单个整数、切片或者列表
In[7]:
data = [1, 2, 3, 4, 5]
series = pd.Series(data) # 创建一个Series类型的数据
# 使用整数位置索引访问数据
print(series.iloc[0])
print(series.iloc[1:3])
out[7]:
1
2,3
df.loc
是Pandas中用于标签索引的一种属性,用于访问DataFrame或Series中的数据。loc
允许你使用标签来选择特定的行和列,这使得索引更加灵活,可以根据标签选择数据,也可以使用条件来筛选。
语法 df.loc[row_label, column_label]
其中的row_label和column_label可以是单个整数、切片或者列表
我们先来尝试一下整行筛选,df.loc
与绝对值筛选的区别是,若使用df.loc[0:4]
,那么将会筛选从索引为0,到索引为4的所有列
In[8]:
df.loc[0:4]
out[8]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
2 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
3 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
如果不想要[0:4]中间的部分,只想要index=0 和 index=4的行,给它们中间的’:‘换成’,'加一个列表嵌套就行,简单来说就是使用标签列表来筛选
In[9]:
df.loc[[0, 4]]
out[9]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
在此就不再赘述Series的df.loc
了基本用法与上类似,不过是从多维转为了一维而已。
df.xs
是Pandas中的一种方法,用于在DataFrame中根据指定的标签或位置(行或列)获取跨越多个层次的数据。它主要用于处理具有多层索引的DataFrame
df.xs(
# 要获取的行或列的标签或位置
key,
# 可选参数,用于指定获取行还是列。默认为行,也可以设置为1(列)
axis = 0,
# 可选参数,用于指定多层索引的级别。只在有层次化索引时才需要设置
level,
# 可选参数,指定是否丢弃返回结果中的索引级别,默认为True
drop_level = True
)
In[10]:
df = pd.read_csv("university_rank.csv", index_col=["排名", "地区"]) # 读取案例数据表并设置双重索引
df
out[10]:
大学名称 | 学科领域 | 排名依据 | ||
---|---|---|---|---|
排名 | 地区 | |||
1 | 北美 | 哈佛大学 | 工程 | 学术声誉 |
2 | 欧洲 | 牛津大学 | 医学 | 科研产出 |
3 | 亚洲 | 北京大学 | 商学 | 国际影响力 |
4 | 大洋洲 | 悉尼大学 | 计算机科学 | 教学质量 |
5 | 南美 | 圣保罗大学 | 艺术 | 学生满意度 |
... | ... | ... | ... | ... |
96 | 南美 | 圣保罗国立大学 | 计算机科学 | 研究生录取率 |
97 | 非洲 | 约翰内斯堡大学 | 环境科学 | 学术声誉 |
98 | 北美 | 麦吉尔大学 | 艺术 | 学生满意度 |
99 | 欧洲 | 伦敦政治经济学院 | 法律 | 国际影响力 |
100 | 亚洲 | 东京大学 | 教育 | 毕业生就业率 |
100 rows × 3 columns
In[11]:
df.xs('北美', level=1)
out[11]:
大学名称 | 学科领域 | 排名依据 | |
---|---|---|---|
排名 | |||
1 | 哈佛大学 | 工程 | 学术声誉 |
7 | 麦吉尔大学 | 教育 | 校友网络 |
11 | 斯坦福大学 | 工程 | 研究成果 |
17 | 麦吉尔大学 | 教育 | 毕业生就业率 |
21 | 加州理工学院 | 工程 | 学术声誉 |
28 | 麦吉尔大学 | 医学 | 教学质量 |
32 | 斯坦福大学 | 经济学 | 校友网络 |
38 | 麦吉尔大学 | 艺术 | 学生满意度 |
42 | 加州理工学院 | 社会科学 | 校友网络 |
48 | 麦吉尔大学 | 艺术 | 学生满意度 |
52 | 斯坦福大学 | 社会科学 | 校友网络 |
58 | 麦吉尔大学 | 艺术 | 学生满意度 |
62 | 加州理工学院 | 社会科学 | 校友网络 |
68 | 麦吉尔大学 | 艺术 | 学生满意度 |
72 | 斯坦福大学 | 社会科学 | 校友网络 |
78 | 麦吉尔大学 | 艺术 | 学生满意度 |
82 | 加州理工学院 | 社会科学 | 校友网络 |
88 | 麦吉尔大学 | 艺术 | 学生满意度 |
92 | 斯坦福大学 | 社会科学 | 校友网络 |
98 | 麦吉尔大学 | 艺术 | 学生满意度 |
在Pandas中,你可以使用多个条件来进行多条件索引。有几种方法可以实现多条件索引,其中一些常用的方法如下
&
和|
操作符: 你可以使用&
表示"与"条件,|
表示"或"条件。通过将条件括在圆括号中,可以确保优先级正确query()
方法: query()
方法允许你使用字符串表示多个条件,更加直观和简洁isin()
方法: isin()
方法允许你检查某一列是否包含指定的多个值,然后将条件应用于DataFrame&
和|
操作符语法df[(option_one) &/| (option_two)...]
其中option_one和option_two都是筛选的条件,结果取决于中间的连接符
In[12]:
df = pd.read_csv("university_rank.csv") # 读取一下案例数据表
df
out[12]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
2 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
3 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
... | ... | ... | ... | ... | ... |
95 | 圣保罗国立大学 | 96 | 南美 | 计算机科学 | 研究生录取率 |
96 | 约翰内斯堡大学 | 97 | 非洲 | 环境科学 | 学术声誉 |
97 | 麦吉尔大学 | 98 | 北美 | 艺术 | 学生满意度 |
98 | 伦敦政治经济学院 | 99 | 欧洲 | 法律 | 国际影响力 |
99 | 东京大学 | 100 | 亚洲 | 教育 | 毕业生就业率 |
100 rows × 5 columns
In[13]:
df[(df.排名 >= 6) & (df.排名 <= 10)] # 使用多条件筛选
out[13]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
5 | 约翰内斯堡大学 | 6 | 非洲 | 法律 | 毕业生就业率 |
6 | 麦吉尔大学 | 7 | 北美 | 教育 | 校友网络 |
7 | 伦敦政治经济学院 | 8 | 欧洲 | 经济学 | 国际化程度 |
8 | 东京大学 | 9 | 亚洲 | 社会科学 | 研究生录取率 |
9 | 澳大利亚国立大学 | 10 | 大洋洲 | 环境科学 | 科研经费 |
目前较常用的筛选语句,query()
方法是Pandas中的一种数据筛选方法,它允许你使用字符串表达式来选择DataFrame中满足特定条件的数据。query()
方法的设计灵感来自于SQL语言的查询语法,它能够简化复杂的条件筛选,并且能够处理大部分的数据选择需求。
语法:df.query(expr, inplace=False)
df.query(
# 类sql语句
expr
# 是否在原df上修改,默认为False
inplace = False
)
Tip:在expr语句中可以使用’@'来引用外部变量
In[14]:
df = pd.read_csv("university_rank.csv") # 读取一下案例数据表
expr = "排名 > 9 and 排名 < 16 and 地区 == '亚洲' " # 使用类sql语句多条件筛选DataFrame表
df.query(expr) # 查看使用query()方法查询的结果
out[14]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
12 | 清华大学 | 13 | 亚洲 | 商学 | 校友网络 |
In[15]:
limit = 5 # 设置一个外部变量
expr = "排名 > @limit and 排名 < 50 and 地区 == '亚洲' " # 在expr参数里面应用外部变量
df.query(expr) # 查看使用query()方法查询的结果
out[15]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
8 | 东京大学 | 9 | 亚洲 | 社会科学 | 研究生录取率 |
12 | 清华大学 | 13 | 亚洲 | 商学 | 校友网络 |
18 | 东京大学 | 19 | 亚洲 | 社会科学 | 国际化程度 |
22 | 香港大学 | 23 | 亚洲 | 商学 | 国际影响力 |
29 | 东京大学 | 30 | 亚洲 | 艺术 | 学生满意度 |
33 | 清华大学 | 34 | 亚洲 | 医学 | 学术声誉 |
39 | 东京大学 | 40 | 亚洲 | 教育 | 毕业生就业率 |
43 | 香港大学 | 44 | 亚洲 | 工程 | 教学质量 |
若想对数量进行控制,那么也可以使用.head()
方法或者.tail()
方法来进行嵌套查询
In[16]:
df.query(expr).head(3)
out[16]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
8 | 东京大学 | 9 | 亚洲 | 社会科学 | 研究生录取率 |
12 | 清华大学 | 13 | 亚洲 | 商学 | 校友网络 |
18 | 东京大学 | 19 | 亚洲 | 社会科学 | 国际化程度 |
isin()
是Pandas中的一种方法,用于检查DataFrame或Series中的元素是否包含在指定的列表、集合或Series中。isin()
方法返回一个布尔值的Series,其中元素为True表示对应的元素在指定的集合中,False表示不在其中。
语法df.col_name.isin(values)
或者df.isin(values)
该方法会返回一个bool数列,其中values一般为一个列表、集合或Series,用于指定待检查的元素集合。
In[17]:
df = pd.read_csv("university_rank.csv") # 读取一下案例数据表
df # 展示案例数据表
out[17]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
2 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
3 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
... | ... | ... | ... | ... | ... |
95 | 圣保罗国立大学 | 96 | 南美 | 计算机科学 | 研究生录取率 |
96 | 约翰内斯堡大学 | 97 | 非洲 | 环境科学 | 学术声誉 |
97 | 麦吉尔大学 | 98 | 北美 | 艺术 | 学生满意度 |
98 | 伦敦政治经济学院 | 99 | 欧洲 | 法律 | 国际影响力 |
99 | 东京大学 | 100 | 亚洲 | 教育 | 毕业生就业率 |
100 rows × 5 columns
In[18]:
df.排名.isin([1, 5, 6])
out[18]:
0 True
1 False
2 False
3 False
4 True
...
95 False
96 False
97 False
98 False
99 False
Name: 排名, Length: 100, dtype: bool
现在返回是一个bool列表,想要获取到筛选后的数据在外面套上一层df就行了
In[19]:
df[df.排名.isin([1, 5, 6])]
out[19]:
大学名称 | 排名 | 地区 | 学科领域 | 排名依据 | |
---|---|---|---|---|---|
0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |
5 | 约翰内斯堡大学 | 6 | 非洲 | 法律 | 毕业生就业率 |
Tips
~
进行反向筛选,即剔除满足条件的。drop()
方法来删除满足的条件列和行between()
方法如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!