日常数据分析中,经常要根据各种不同的条件从数据集中筛选出想要的数据,再进行提取、替换、修改和分析等操作,因此筛选过滤是数据分析中使用频率最高的操作之一。在刚开始用Python做数据分析的时候,常常是使用for循环在数据集中进行条件筛选,致使代码比较冗长且效率不高。本篇分享一下在python中常用的并且使用效率比较高的几种数据筛选函数:isin()、query()、contains()、loc()、iloc()等,并且探索了它们单独使用或搭配一起使用的效果。
目录
数据准备:
import numpy as np import pandas as pd df = pd.DataFrame({'Name': ['张三', '李四', '王五', '赵六', '于七', '黑九', '王五'], 'Chinese':[100,99,79,89,88,96,85], 'Math': [77,56,88,90,45,77,80], 'Rank': [1,1,1,2,1,1,2]}) df
一、简单的筛选方法
- 单一的筛选:条件范围可以是数值或字符串
df[df[‘column_name’] == value]
- 多字段的筛选(又称为复合条件的筛选): 多个不同的特征列,并且条件可以对应不同的数值或字符串
df[(df[‘column_name1’] <= value) & (df[‘column_name2’] == str)]
二、isin函数
L = [20, 25, 27] 或 L = np.arange(20, 30) df[df[‘column_name’].isin(L)]
根据从isin函数传入的列表(L),筛选出与列表中包含的数值或字符串相同的数据记录, 用法有点类似sql中的"in"
三、query函数
df.query('(column_name1 == 'str1') & (column_name2 == 'str2')')
根据query中引入的不同字段(str1,str2等)和条件,筛选出同时能满足这些要求的数据记录
注意:
在使用query函数时,所有的表达内容都必须用引号标识出来,并且字符串的引号" "与表达式的引号' '需要区分出来(即遵从使用双引号与单引号的套用规则)。另外,列名是不需要使用引号标注的,这可以理解为是直接调用了列表,因此列名称不需要标注。
四、contains函数
df[df['column_name'].str.contains('str')]
筛选出所有含有(str)的数据记录, 用法类似于sql中的"contains"
五、loc与iloc函数
1. loc函数
(1) 切割:[ 左闭右闭 ]
df.loc[index1:index2, column1:column2] df.loc[10:20] #标签索引在10到20之间的行数据 df.loc[10:20, 'column'] #标签索引在10到20之间,列名为'column'的行数据 df.loc[10:20, 'column1':'column2'] #标签索引在10到20之间,列名为column1到column2之间的行数据 df[['column1','column2']].loc[10:20] #标签索引在10到20之间,列名为'column1'与'column2'的行数据
(2) 条件筛选:
df.loc[df['column_name'] <= value]
根据特征属性(列名)或索引标签筛选数据:df.loc[columns 筛选条件] 或df.loc[index 筛选条件];
同时根据索引标签和特征属性(列名)筛选数据:df.loc[index 筛选条件,columns 筛选条件]
2. iloc函数
根据特征位置索引来截取数据
切割:[ 左闭右开 )
iloc[a:b, c:d] #生成dataframe,[a-b)行,[c-d)列,(abcd只能为位置索引值,不为字段名) iloc[a]或iloc[a,:] #行位置索引为a的行数据 iloc[a,b] #行位置索引为a,列位置索引为b的交叉点数据 iloc[a:b] #行位置索引为a到行位置索引为b的所有行数据 iloc[a:b,c] #行位置索引为a到行位置索引为b,列位置索引为c的交集数据 df[['column1','column2']].iloc[a:b] #行位置索引为a到行位置索引为b,列名为column1与column2的dateframe
3. loc与iloc的联系和区别
如下df、df9两个表:
以上面 df 与 df9 两个表为例,loc与iloc分别输出一样的内容时,两者参数的差别:
- loc() 函数:指Selection by label的函数, 是按照标签来提取数据,标签是由2个参数决定的。
第1个参数是index: “0”-“6”; 第2个参数是column: “Chinese”, “Math”, “Rank” # df.loc[6, :] # df.loc[6, “Math”]
2. iloc(n, m) 函数:指Selection by Position的函数,是按位置选择数据,即第n行,第m列,只接受整数型的参数
# df.iloc[:, 0]; # df.iloc[1, :]
六、函数搭配
小结:
- 单一条件的行或列的筛选可直接使用df[columns 筛选条件] 或df[indx 筛选条件]
- isin 函数的使用很灵活,能将多个不用的数值范围要求或字段要求通过列表的形式传入函数中进行筛选
- query 函数能进行多字段的筛选,但要特别注意列名的引用,以及格式的书写与其他函数不一样的地方
- contains 函数其实是相当与SQL 中的contains的用法,能灵活地对字符串的数据进行筛选。
- 筛选方法和函数是可以根据不同的需要被搭配在一起形成多重的条件筛选,并且使用的效果很不错!
- 如果是同时对行和列进行筛选,可使用df.loc[index 筛选条件,columns 筛选条件]
- 辨清loc[ ] 与 iloc[ ]函数使用的差别