【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言

当涉及数据处理和分析时,Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法,使得数据的选择、筛选和处理变得简单而高效。在本博客中,我们将重点介绍Pandas中数据筛选的关键知识点,包括条件索引、逻辑操作符、query()方法以及其他一些常用技巧~


2. 筛选

在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

在这里插入图片描述

2.1 整数位置索引筛选

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

2.2 标签索引筛选

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了基本用法与上类似,不过是从多维转为了一维而已。


2.3 多重索引筛选

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 麦吉尔大学 艺术 学生满意度

2.4 多条件索引筛选

在Pandas中,你可以使用多个条件来进行多条件索引。有几种方法可以实现多条件索引,其中一些常用的方法如下

  • 使用&|操作符: 你可以使用&表示"与"条件,|表示"或"条件。通过将条件括在圆括号中,可以确保优先级正确
  • 使用query()方法: query()方法允许你使用字符串表示多个条件,更加直观和简洁
  • 使用isin()方法: isin()方法允许你检查某一列是否包含指定的多个值,然后将条件应用于DataFrame

2.4.1 使用&|操作符

语法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 大洋洲 环境科学 科研经费

2.4.2 query()方法

目前较常用的筛选语句,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 亚洲 社会科学 国际化程度

2.4.3 isin()方法(布尔索引筛选)

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

  • 在Pandas中可以使用~进行反向筛选,即剔除满足条件的。
  • 也可以使用drop()方法来删除满足的条件列和行
  • 在进行范围筛选的使用也可以使用between()方法

结束语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

你可能感兴趣的:(Python,数据挖掘,python,数据分析)