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

1. 前言

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


2. 筛选

在Python和Pandas库中,索引是一种用于标识和访问数据的重要概念。索引可以是整数、标签、日期等类型,它允许我们按照指定的标记来查找、选择和操作数据。本文重点介绍的是Pandas中的筛选操作,我们先来简单回顾一下Python中一些筛选的相关操作。

在Python中列表、元组、字符串、字典都是支持索引的数据结构。索引从0开始,表示数据元素在序列中的位置。

例如,对于列表可以通过list[0]来访问列表的一个元素

In[0]:

python 复制代码
list_filter = [1,2,3,4,5]
print(list_filter[0])
print(list_filter[1])

out[0]:

1
2

对于字符串,也可以使用索引来访问单个字符

In[1]:

python 复制代码
string_filter = "hello"
print(string_filter[0])
print(string_filter[1])

out[1]:

h
e

对于元组亦是如此

In[2]:

python 复制代码
tuple_filter = (1, 2, 3, 4)
print(tuple_filter[0])
print(tuple_filter[2])

out[2]:

1
3

对于字典则是可以通过''键''来索引字典中的值

In[3]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
df.iloc[0:2] # 对案例数据表进行整行筛选

out[5]:

| | 大学名称 | 排名 | 地区 | 学科领域 | 排名依据 |
| 0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |

1 牛津大学 2 欧洲 医学 科研产出

行能切边,那列能不能切片呢?答案当然是能,只需要用' , '来分割行列之间的索引即可。

In[6]:

python 复制代码
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]:

python 复制代码
df.loc[0:4]

out[8]:

| | 大学名称 | 排名 | 地区 | 学科领域 | 排名依据 |
| 0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
| 1 | 牛津大学 | 2 | 欧洲 | 医学 | 科研产出 |
| 2 | 北京大学 | 3 | 亚洲 | 商学 | 国际影响力 |
| 3 | 悉尼大学 | 4 | 大洋洲 | 计算机科学 | 教学质量 |

4 圣保罗大学 5 南美 艺术 学生满意度

如果不想要[0:4]中间的部分,只想要index=0 和 index=4的行,给它们中间的':'换成','加一个列表嵌套就行,简单来说就是使用标签列表来筛选

In[9]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
df = pd.read_csv("university_rank.csv") # 读取一下案例数据表
expr = "排名 > 9 and 排名 < 16 and 地区 == '亚洲' " # 使用类sql语句多条件筛选DataFrame表
df.query(expr) # 查看使用query()方法查询的结果

out[14]:

| | 大学名称 | 排名 | 地区 | 学科领域 | 排名依据 |

12 清华大学 13 亚洲 商学 校友网络

In[15]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
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]:

python 复制代码
df[df.排名.isin([1, 5, 6])]

out[19]:

| | 大学名称 | 排名 | 地区 | 学科领域 | 排名依据 |
| 0 | 哈佛大学 | 1 | 北美 | 工程 | 学术声誉 |
| 4 | 圣保罗大学 | 5 | 南美 | 艺术 | 学生满意度 |

5 约翰内斯堡大学 6 非洲 法律 毕业生就业率

Tips

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

结束语

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

相关推荐
爱数学的程序猿3 分钟前
Python入门:6.深入解析Python中的序列
android·服务器·python
comli_cn30 分钟前
使用清华源安装python包
开发语言·python
赵谨言41 分钟前
基于python 微信小程序的医院就诊小程序
经验分享·python·毕业设计
1.01^10001 小时前
[1111].集成开发工具Pycharm安装与使用
python·pycharm
HEX9CF1 小时前
【Django】测试带有 CSRF 验证的 POST 表单 API 报错:Forbidden (CSRF cookie not set.)
python·django·csrf
凡人的AI工具箱2 小时前
每天40分玩转Django:实操多语言博客
人工智能·后端·python·django·sqlite
Py办公羊大侠2 小时前
Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
python·excel·打印·openpyxl·自动换行·显示不全
PieroPc2 小时前
Python tkinter写的《电脑装配单》和 Html版 可打印 可导出 excel 文件
python·html·电脑
Cachel wood2 小时前
Django REST framework (DRF)中的api_view和APIView权限控制
javascript·vue.js·后端·python·ui·django·前端框架
暮色尽染2 小时前
Python 正则表达式
开发语言·python