【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[<start_loc>:<end_loc>],这里需要注意的是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()方法

结束语

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年11月7日
下一篇 2023年11月7日

相关推荐