当前位置:首页 > 虚拟主机 > 正文

pandas数据处理基础之筛选指定行或者指定列的数据

在数据处理中,筛选指定行或列是pandas最基础也是最核心的操作之一,pandas作为Python数据分析的利器,提供了丰富而灵活的方法来实现数据筛选,这些方法主要依托于其核心数据结构——DataFrame和Series,理解并熟练掌握这些筛选技巧,是进行后续数据清洗、转换和分析的前提。

我们来探讨如何筛选指定的列,在实际分析场景中,数据集往往包含成百上千列,而我们可能只对其中某些列感兴趣,筛选列的操作相对简单直观,主要有以下几种方式,最常见的是通过列名的列表进行筛选,假设我们有一个名为df的DataFrame,我们可以通过传入一个包含所需列名的列表来获取一个新的DataFrame,例如df[['列名1', '列名2']],这种方法会保留原始的列顺序,并且返回的结果仍然是一个DataFrame,需要注意的是,当只选择一列时,如果使用单层方括号,如df['列名1'],返回的结果是一个Series;而使用双层方括号,如df[['列名1']],则会返回一个仅包含该列的DataFrame,这一点在实际操作中需要特别注意,以避免后续操作因数据类型不一致而报错。

另一种筛选列的方式是使用filter()方法,该方法功能更为强大,它允许我们通过items参数指定列名的列表进行精确筛选,例如df.filter(items=['列名A', '列名B']),这与通过列名列表直接索引的效果类似。filter()方法的真正优势在于其like参数,它可以根据列名中是否包含特定字符串来进行模糊匹配。df.filter(like='价格')会返回所有列名中包含“价格”这两个字的列。regex参数则提供了更强大的正则表达式匹配能力,可以满足更复杂的列名筛选模式,例如df.filter(regex='^日期|ID$')会筛选出以“日期”开头或以“ID”结尾的所有列。

pandas数据处理基础之筛选指定行或者指定列的数据 第1张

我们重点讨论如何筛选指定的行,行的筛选通常基于一定的条件,即通过布尔表达式(Boolean Indexing)来实现,这是pandas筛选行数据最核心、最常用的方法,其基本语法是df[条件表达式],要筛选出某一列(假设为’年龄’)的值大于30的所有行,我们可以使用df[df['年龄'] > 30],在这个表达式中,df['年龄'] > 30会生成一个与DataFrame行数相同的布尔Series,其中满足条件的行对应True,不满足的对应False,pandas会自动保留这些为True的行,这种单个条件的筛选非常简单,但现实中的筛选条件往往更为复杂,可能需要结合多个条件。

当需要同时满足多个条件时,我们可以使用逻辑运算符&(与)、(或)和(非),但有一个非常重要的注意事项:在pandas中,这些逻辑运算符不能直接使用Python关键字and、or、not,而必须使用对应的符号,并且每个条件表达式都必须用圆括号括起来,以确保运算的优先级正确,要筛选出年龄大于30且性别为男性的所有行,正确的写法是df[(df['年龄'] > 30) & (df['性别'] == '男')],如果要筛选出年龄小于18或者年龄大于65的所有行,则可以使用运算符:df[(df['年龄'] < 18) | (df['年龄'] > 65)],对于非条件的筛选,例如筛选出年龄不等于30的行,可以使用:df[~(df['年龄'] == 30)]。

除了基于布尔表达式的筛选,pandas还提供了基于标签(.loc)和基于整数位置(.iloc)的索引方法,它们同样可以用于行筛选。.loc是通过行标签(即索引index的值)来筛选,例如df.loc['行标签A':'行标签C']会筛选出从’行标签A’到’行标签C’(包含两端)的所有行。.iloc则是通过行的整数位置(从0开始)来筛选,例如df.iloc[0:5]会筛选出前5行(不包含第5行),这两种方法在需要按特定顺序或位置选取数据时非常有用,特别是在数据预处理阶段对特定样本进行操作。

pandas数据处理基础之筛选指定行或者指定列的数据 第2张

我们还可以结合query()方法进行行筛选。query()方法提供了一种更接近自然语言的语法来书写筛选条件,当条件表达式非常复杂时,使用query()可以使代码更易读,上述的年龄大于30且性别为男性的条件,可以写成df.query("年龄 > 30 and 性别 == '男'"),在query()方法中,可以直接使用列名作为变量,而不需要重复书写df['列名'],这在简化代码方面优势明显。query()也支持在字符串中使用变量,只需在变量名前加上符号即可,例如age_limit = 30; df.query("年龄 > @age_limit")。

为了更清晰地展示这些方法,我们可以通过一个简单的表格来对比它们的使用场景和示例:

筛选类型 方法/函数 示例 说明
筛选列 列名列表 df[['姓名', '年龄']] 选择指定的多列,返回DataFrame。
filter(items=...) df.filter(items=['姓名', '年龄']) 精确选择列名列表中的列。
filter(like=...) df.filter(like='价格') 模糊匹配列名中包含特定字符串的列。
筛选行 布尔索引 df[df['年龄'] > 30] 根据单个条件筛选行。
多条件布尔索引 df[(df['年龄'] > 30) & (df['性别'] == '男')] 使用&、、组合多个条件。
.loc (标签索引) df.loc['row1':'row3'] 通过行标签筛选行。
.iloc (位置索引) df.iloc[0:3] 通过行整数位置筛选行。
query()方法 df.query("年龄 > 30 and 性别 == '男'") 使用类SQL语法筛选行,可读性高。

pandas提供了从简单到复杂、从精确到模糊的多种数据筛选手段,选择哪种方法取决于具体的数据结构和筛选需求,对于初学者而言,应首先熟练掌握基于列名列表的列筛选和基于布尔表达式的行筛选,这是最基础也是最常用的操作,随着对pandas的深入了解,再逐步学习和运用.loc、.iloc以及filter()、query()等更高级的功能,这将极大地提升数据处理的效率和代码的可读性。

pandas数据处理基础之筛选指定行或者指定列的数据 第3张

相关问答FAQs

问题1:在pandas中,如何高效地筛选出DataFrame中某一列包含特定字符串的所有行?

解答:要筛选出某一列包含特定字符串的所有行,最推荐且高效的方法是使用str.contains()方法结合布尔索引,假设DataFrame为df,要筛选的列为’产品描述’,目标字符串为’新款’,代码如下:df[df['产品描述'].str.contains('新款')]。str.contains()方法会返回一个布尔Series,表示每个单元格的字符串是否包含目标子串,需要注意的是,str.contains()默认是区分大小写的,如果需要进行不区分大小写的匹配,可以设置参数case=False,即df[df['产品描述'].str.contains('新款', case=False)],如果目标字符串中可能包含正则表达式元字符(如、等),并且希望将其作为普通字符串处理,可以设置regex=False。

问题2:使用布尔索引筛选行时,如果筛选条件非常复杂,涉及到多个列和多种逻辑组合,如何让代码更清晰易读?

解答:当筛选条件非常复杂时,直接在一个方括号内书写冗长的布尔表达式会严重影响代码的可读性和可维护性,推荐采用“分步定义条件变量”的策略,具体做法是,将每一个子条件分别赋值给一个变量名,然后再将这些变量名通过逻辑运算符组合起来,假设我们要筛选出“年龄在25到35岁之间(包含25和35)、居住地为‘北京’、且账户余额大于10000的用户”,可以这样写:age_condition = (df['年龄'] >= 25) & (df['年龄'] <= 35),city_condition = (df['居住地'] == '北京'),balance_condition = (df['账户余额'] > 10000),final_condition = age_condition & city_condition & balance_condition,df[final_condition],这种方式将复杂的逻辑拆解成一个个有意义的、自解释的子条件,使得代码结构清晰,不仅易于阅读,也方便后续对单个条件进行修改或调试,对于更复杂的场景,使用query()方法也是一个不错的选择,它提供了更接近自然语言的语法,可以进一步简化复杂的条件表达式。

0