日常的数据分析中,经常要根据各种不同的条件从数据集中筛选出相应的数据记录,再进行提取、替换、修改和分析等操作。因此筛选是数据分析中使用频率最高的操作之一。在刚开始做数据分析的时候,常常是使用for循环在数据集中进行条件筛选,导致代码比较冗长且效率不高。本文总结了在python中常用的并且使用效率比较高的几种数据筛选函数如:isin()、query()、contains()等,并且展示了它们单独使用或搭配一起使用的实践效果。
2. 筛选方法和函数简介-
简单的筛选方法:
单一的筛选:条件范围可以是数值或字符串
df.loc[df[“column_name”] == value]
多字段的筛选(又称为复合条件的筛选): 多个不同的特征列,并且条件可以对应不同的数值或字符串
df.loc[(df[“column_name1”] <= value) & (df[“column_name2”] == str)] -
isin函数:df[df[“column_name”].isin(li)]
根据从isin函数传入的列表(li),筛选出与列表中包含的数值或字符串相同的数据记录, 用法有点类似sql中的"in" -
query函数:df.query("(column_name1 == ‘str1’) & (column_name2 == ‘str2’)")
根据query中引入的不同字段(str1,str2等)和条件,筛选出同时能满足这些要求的数据记录 -
contrains函数:df[df[“column_name”].str.contians(“str”)]
筛选出所有含有(str)的数据记录, 用法类似于sql中的"contains"
数据准备:数据按行筛选(数据记录)并提取数据
import numpy as np
import pandas as pd
df = pd.Dataframe({"name": ["A001", "A002", "B001", "A001_K", "C002", "B001_K", "B001"],
"protein": [25, 28, 45, 22, 60, 40, 27],
"Qty": [85, 90, 75, 80, 30, 50, 30],
"rank": ["1st", "1st", "1st", "2nd", "1st", "1st", "2nd"]})
df
3.2 示例代码
3.2.1 简单的条件筛选方法
# 1 简单的条件筛选:单一条件筛选 data = df[df["protein"] <= 30] data
# 2 多重条件筛选 -- 筛选的条件是数值 # 筛选并提取protein 在40-50之间的记录(符合条件) data = df[(df["protein"] >= 40) & (df["protein"] <= 50)] data
# 3 多重条件筛选 -- 筛选的条件有数值和字符串 # 筛选出蛋白质含量大于30并且产品评级为"1st"的数据 data = df[(df["protein"] >= 30) & (df["rank"] == "1st")] data3.2.2 isin 函数的使用
返回的结果是根据从isin函数传入的列表(li),筛选出与列表中包含的数值或字符串相同的数据记录, 用法有点类似sql中的"in"
# 筛选出与列表中的数值或字符串相等的数据记录 # li = np.arange(20, 30) li = [25, 60, 45, 40] data = df[df["protein"].isin(li)] data3.2.3 query 函数的使用
返回的结果是根据query中引入的不同字段(str1,str2)和条件,筛选出同时能满足这些要求的数据记录
# 筛选出名称为“A001”或“B001”,并且级别都是“1st”的数据记录
data = df.query("(name=='A001'| name=='B001') & (rank == '1st')")
data
温馨提示:在使用query函数时,所有的表达内容都必须用引号标识出来,并且字符串的引号与表达式的引号需要区分出来(即遵从使用双引号与单引号的套用规则)。另外,特征列名称是不需要使用引号标注的,这可以理解为是直接调用了列表,因此列名称则不需要注释。
# 1 筛选出所有名称中还有“K”的数据记录
data = df[df["name"].str.contains("K")]
data
# 2 筛选出级别中含有"st", 并且名字中含有"K"的数据记录
data = df[(df["rank"].str.contains("st") & df["name"].str.contains("K"))]
data
3.2.5 筛选函数的搭配使用
上述介绍的筛选方法和函数是可以被搭配在一起使用,并且效果很不错!
# 1 筛选出蛋白质小于等于30,并且级别是含有"2nd"的数据记录
data = df[(df["protein"] <=30) & df["rank"].str.contains("2nd")]
data
# 2 筛选出蛋白质的含量是列表中的数值,并且名称中含有"K"的数据记录
li = [25, 60, 45, 40, 22]
data = df[(df["protein"].isin(li)) & (df["name"].str.contains("K"))]
data
4. 结束语
- 单一条件的行或列的筛选可直接使用df[columns 筛选条件] 或df[indx 筛选条件]; 如果是同时对行和列进行筛选,可使用df.loc[index 筛选条件,columns 筛选条件]
- isin 函数的使用很灵活,能将多个不用的数值范围要求或字段要求通过列表的形式传入函数中进行筛选。
- query 函数能进行多字段的筛选,但要特别注意列明的引用,以及格式的书写与其他函数不一样的地方。
- contains 函数其实是相当与SQL 中的contains的用法,能灵活地对字符串的数据进行筛选。
- 筛选方法和函数是可以根据不同的需要被搭配在一起形成多重的条件筛选,并且使用的效果很不错!



