Python dataframe 多条件筛选/过滤数据的方法及函数isin,query,contains,loc的使用介绍

1. 背景概述

日常的数据分析中,经常要根据各种不同的条件从数据集中筛选出相应的数据记录,再进行提取、替换、修改和分析等操作。因此筛选是数据分析中使用频率最高的操作之一。在刚开始做数据分析的时候,常常是使用for循环在数据集中进行条件筛选,导致代码比较冗长且效率不高。本文总结了在python中常用的并且使用效率比较高的几种数据筛选函数如:isin()、query()、contains()、loc()等,并且展示了它们单独使用或搭配一起使用的实践效果。

2. 筛选方法和函数简介

2.1 简单的筛选方法:
单一的筛选:条件范围可以是数值或字符串
df[df[“column_name”] == value]
多字段的筛选(又称为复合条件的筛选): 多个不同的特征列,并且条件可以对应不同的数值或字符串
df[(df[“column_name1”] <= value) & (df[“column_name2”] == str)]

2.2 isin函数:df[df[“column_name”].isin(li)] (# li = [20, 25, 27] 或 li = np.arange(20, 30))
根据从isin函数传入的列表(li),筛选出与列表中包含的数值或字符串相同的数据记录, 用法有点类似sql中的"in"

2.3 query函数:df.query("(column_name1 == ‘str1’) & (column_name2 == ‘str2’)")
根据query中引入的不同字段(str1,str2等)和条件,筛选出同时能满足这些要求的数据记录

2.4 contains函数:df[df[“column_name”].str.contains(“str”)]
筛选出所有含有(str)的数据记录, 用法类似于sql中的"contains"

2.5 loc函数:df.loc[df["column_name] <= value]
根据特征属性(列名)或索引标签筛选数据:df.loc[columns 筛选条件] 或df.loc[index 筛选条件];
同时根据索引标签和特征属性(列名)筛选数据:df.loc[index 筛选条件,columns 筛选条件]

2.6 筛选函数之间还能根据各自的特点搭配使用

3. 函数的使用实践

3.1 数据准备和说明

数据准备:数据按行筛选(数据记录)并提取数据
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

在这里插入图片描述
代码描述:df.loc[df[“protein”] <= 30] 与 df[df[“protein”] <= 30]的运行结果是一样的。

# 2 多重条件筛选 -- 筛选的条件是数值
# 筛选并提取protein 在40-50之间的记录(符合条件)
data = df[(df["protein"] >= 40) & (df["protein"] <= 50)]
data

在这里插入图片描述

# 3 多重条件筛选 -- 筛选的条件有数值和字符串
# 筛选出蛋白质含量大于30并且产品评级为"1st"的数据
data = df[(df["protein"] >= 30) & (df["rank"] == "1st")]
data

在这里插入图片描述

3.2.2 isin 函数的使用

返回的结果是根据从isin函数传入的列表(li),筛选出与列表中包含的数值或字符串相同的数据记录, 用法有点类似sql中的"in"

# 筛选出与列表中的数值或字符串相等的数据记录
# li = np.arange(20, 30)
li = [25, 60, 45, 40]
data = df[df["protein"].isin(li)]
data

在这里插入图片描述

3.2.3 query 函数的使用

返回的结果是根据query中引入的不同字段(str1,str2)和条件,筛选出同时能满足这些要求的数据记录

# 筛选出名称为“A001”或“B001”,并且级别都是“1st”的数据记录
data = df.query("(name=='A001'| name=='B001') & (rank == '1st')")
data

在这里插入图片描述
温馨提示:在使用query函数时,所有的表达内容都必须用引号标识出来,并且字符串的引号与表达式的引号需要区分出来(即遵从使用双引号与单引号的套用规则)。另外,特征列名称是不需要使用引号标注的,这可以理解为是直接调用了列表,因此列名称不需要注释。

3.2.4 contains 函数的使用
# 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 loc 函数的使用
# 5. loc() 函数 -- 根据标签和特征列名进行数据筛选 
# 5.1 单一条件的筛选
data = df.loc[df["protein"] <=30]    # 与df[df["protein"] <=30]的运行结果是一致的!
data

在这里插入图片描述
小结:这与之前说的 df[df[“protein”] <=30] 的运行结果是一致的!

# 5.2 复合条件的筛选
# 筛选出名称为"B001"并且蛋白质含量低于30的数据记录
data = df.loc[(df["name"]=="B001") & (df["protein"]<=30)]
data

在这里插入图片描述

# 5.3 使用loc函数同时对索引标签和特征属性(列名)进行数据筛选
# 注意:当使用loc函数根据索引标签和特征列名进行筛选时,需要设定相应的索引标签。本测试会先将名称更换为索引值再进行筛选(使用set_index()函数将特征列名转换为索引值)

# 筛选出名称为"B001"的所有数据记录
test = df.copy().set_index("name")
test.loc["B001", :]

在这里插入图片描述

# 5.4 筛选出名称为"B001"和“A001”的蛋白质和评级数据
test_ = test.loc[["B001", "A001"], ["protein", "rank"]]
test_

在这里插入图片描述

3.2.6 筛选函数的搭配使用

上述介绍的筛选方法和函数是可以被搭配在一起使用,并且效果很不错!

# 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. 结束语

  1. 单一条件的行或列的筛选可直接使用df[columns 筛选条件] 或df[indx 筛选条件]
  2. isin 函数的使用很灵活,能将多个不用的数值范围要求或字段要求通过列表的形式传入函数中进行筛选。
  3. query 函数能进行多字段的筛选,但要特别注意列名的引用,以及格式的书写与其他函数不一样的地方。
  4. contains 函数其实是相当与SQL 中的contains的用法,能灵活地对字符串的数据进行筛选。
  5. 筛选方法和函数是可以根据不同的需要被搭配在一起形成多重的条件筛选,并且使用的效果很不错!
  6. 如果是同时对行和列进行筛选,可使用df.loc[index 筛选条件,columns 筛选条件]
基础概念:loc函数与iloc函数的区别
  1. loc() 函数:指Selection by label的函数
    是按照标签来提取数据,标签是由2个参数决定的。
    第1个参数是index: “0”-“6”; 第2个参数是column: “name”, “protein”, “Qty”, “rank” # df.loc[6, :], # df.loc[6, “protein”]
  2. iloc(n, m) 函数:指Selection by Position的函数
    是按位置选择数据,即第n行,第m列,只接受整数型 的参数 # df.iloc[:, 0]; #df.iloc[1, :]
<think>好的,我现在要帮用户解决PythonDataFrame字段过滤的问题。首先,我需要理解用户的需求。他们可能想了解如何根据特定条件筛选数据,比如选择某些列或根据行条件过滤数据。 接下来,我应该回忆pandas库的基本操作,因为DataFrame是pandas的核心结构。记得常用的方法有列选择、行过滤,以及结合布尔索引和查询方法。 然后,考虑用户可能的场景。例如,他们可能需要处理包含多个字段的数据集,如销售数据或用户信息,需要筛选出特定列或符合条件的行。这时候,列选择可以通过df[['列名']]或者loc和iloc方法。行过滤通常用布尔表达式,比如df[df['年龄'] > 30],或者query方法。 还要注意常见错误,比如多个条件组合时忘记加括号,或者列名有空格时query使用方式。同时,提醒用户避免链式赋值,可能导致SettingWithCopyWarning。 用户可能想知道不同方法的效率,比如向量化操作比循环快,或者query方法的简洁性。此外,可能涉及到字符串操作或正则表达式过滤列名,这时候可以结合df.filter()方法。 需要结构化回答,分步骤说明,比如列过滤、行过滤、组合条件、函数应用等。每个部分给出示例代码,并解释注意事项。最后总结最佳实践,帮助用户正确高效地处理数据。 检查是否有遗漏点,比如特殊字符处理、多条件逻辑运算,或者使用isin、between等方法。确保覆盖基本到进阶的内容,满足不同层次用户的需求。避免使用复杂术语,保持解释清晰易懂,适合中文读者。</think>在Python中,使用pandas库的DataFrame进行字段过滤数据处理的核心操作。以下是分步说明和示例: --- ### 一、列字段过滤 #### 1. 选择指定列 ```python import pandas as pd df = pd.DataFrame({'姓名': ['Alice', 'Bob'], '年龄': [25, 30], '城市': ['北京', '上海']}) # 单列选择 name_col = df['姓名'] # 返回Series name_col_df = df[['姓名']] # 返回DataFrame # 多列选择 subset = df[['姓名', '城市']] ``` #### 2. 正则表达式过滤列名 ```python # 选择以"城"开头的列 filtered_cols = df.filter(regex='^城') ``` --- ### 二、行记录过滤 #### 1. 简单条件筛选 ```python # 年龄大于28的行 older_than_28 = df[df['年龄'] > 28] # 城市为北京或上海的行 city_filter = df['城市'].isin(['北京', '上海']) beijing_shanghai = df[city_filter] ``` #### 2. 多条件组合 ```python # AND条件(注意括号) filtered = df[(df['年龄'] > 20) & (df['城市'] == '北京')] # OR条件 filtered = df[(df['年龄'] < 25) | (df['城市'] == '上海')] ``` --- ### 三、高级过滤方法 #### 1. query()方法 ```python # 直接使用列名筛选 result = df.query('年龄 > 25 and 城市 == "北京"') # 变量传参 min_age = 25 result = df.query('年龄 > @min_age') ``` #### 2. 字符串模糊查询 ```python # 城市包含"海"字 df[df['城市'].str.contains('海')] # 正则匹配(开头为"北") df[df['城市'].str.match('^北')] ``` --- ### 四、复合操作 #### 1. 列行同时过滤 ```python df.loc[df['年龄'] > 25, ['姓名', '城市']] ``` #### 2. 自定义函数 ```python # 使用lambda筛选 df[df.apply(lambda row: row['年龄'] > 25 and '海' in row['城市'], axis=1)] ``` --- ### 五、注意事项 1. **链式操作风险**:避免连续使用`df[条件1][条件2]`,应使用`df[条件1 & 条件2]` 2. **空值处理**:使用`df.dropna()`或`df.fillna()`预处理缺失值 3. **性能优化**:大数据集推荐使用`numexpr`加速`query()`方法 4. **类型检查**:确保过滤条件的变量类型与列类型一致 --- ### 六、完整示例 ```python # 创建示例数据 data = { '姓名': ['王伟', '李芳', '张强'], '年龄': [28, 32, 25], '城市': ['北京', '杭州', '上海'], '工资': [15000, 22000, 18000] } df = pd.DataFrame(data) # 复合条件过滤 result = df.query('年龄 > 25 and 工资 > 16000').filter(regex='姓|城|工') print(result) ``` 输出结果: ``` 姓名 城市 工资 0 王伟 北京 15000 1 李芳 杭州 22000 ``` --- 通过灵活组合这些方法,可以实现复杂的业务逻辑过滤。建议优先使用向量化操作(如`query()`和布尔索引)以提高执行效率。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值