pandas的数据筛选,过滤,检索功能是其最基础也是最重要的功能之一。
在pandas中最常用的几种数据过滤方式如下:
- 行列过滤:选取指定的行或者列
- 条件过滤:对列的数据设置过滤条件
- 函数过滤:通过函数设置更加复杂的过滤条件
在开始之前,本篇文章使用的测试数据下载地址为:https://download.csdn.net/download/qq_42692386/91724806
这是一个1000行8列的雇员数据集,列分别为员工姓名,性别,入职日期,最近一次登录时间,薪水,奖金,是否为高级管理人员,小组(部门)
为了使用方便,在导入时我们首先将列名中的空格全部替换为下划线,导入并处理数据代码如下:
import pandas as pd
df = pd.read_csv(r"C:\Users\CC9B28\Downloads\employees.csv")
df.columns = [column.replace(" ", "_") for column in df.columns]
当然也可以使用df.rename对列名进行更改。
1. 行列过滤
pandas中最常用的按行或者按列选择数据的函数是 loc 和 iloc。
1.1 loc 函数
loc函数通过标签索引选择行列数据,行索引即为对应的索引序号(即下图中的红框部分),列索引即为列名,可以在一个语句中同时指定行和列的条件。
选取第二行。注意列索引是从0开始的,所以第二行对应的列索引是1.
#如下两个方法返回的结果一致,都是返回数据第二行
df.loc[1]
df.loc[1,:]
选取连续多行:
df=df.loc[1:5,:]
输出的结果为:
First_Name Gender Start_Date ... Bonus Senior_Management Team
1 Thomas Male 1996/3/31 ... 2582.60610 True NaN
2 Maria Female 1993/4/23 ... 15485.36220 False Finance
3 Jerry Male 2005/3/4 ... 12955.04700 True Finance
4 Larry Male 1998/1/24 ... 1402.94556 True Client Services
5 Dennis Male 1987/4/18 ... 11660.25375 False Legal
[5 rows x 8 columns]
选取指定的行:
df.loc[[1,5],:]
输出的结果为:
First_Name Gender Start_Date ... Bonus Senior_Management Team
1 Thomas Male 1996/3/31 ... 2582.60610 True NaN
5 Dennis Male 1987/4/18 ... 11660.25375 False Legal
[2 rows x 8 columns]
对于列也是同样的逻辑。
#选取连续多列
df.loc[:, "Bonus":"Team"]
#选取指定的列
df.loc[:, ["Bonus","Team"]]
对于行和列也可以同时设置进行筛选:
df.loc[1:4, ["First_Name","Team"]]
筛选结果为:
First_Name Team
1 Thomas NaN
2 Maria Finance
3 Jerry Finance
4 Larry Client Services
1.2 iloc 函数
iloc函数通过整数位置索引选择行列数据。这种方法与loc方法类似,但是它使用整数位置而不是标签。
选取连续多行:
df.iloc[1:5, :]
筛选结果为:
First_Name Gender Start_Date ... Bonus Senior_Management Team
1 Thomas Male 1996/3/31 ... 2582.60610 True NaN
2 Maria Female 1993/4/23 ... 15485.36220 False Finance
3 Jerry Male 2005/3/4 ... 12955.04700 True Finance
4 Larry Male 1998/1/24 ... 1402.94556 True Client Services
[4 rows x 8 columns]
注意这里可以看出iloc和loc的区别,同样的范围[1:5],iloc不包括index=5的数据,而loc是包括index=5的数据。
选择指定的行:
df.iloc[[1,5], :]
和loc的结果是一致的
筛选连续多列:
df.iloc[:, 0:3]
注意这里是 iloc和loc的另一个区别,iloc只能用数字序列来表示列的范围(第一列对应数字0),
回顾之前的loc函数,我们可以用列名来表示范围的df.loc[:, “年份”:“指标中文”]。
另外,iloc表示列的范围0:3表示是0,1,2三列,不包括3这一列。
同样iloc也可以行和列同时设置
df.iloc[1:5, [0, 2]]
iloc还可以从后往前筛选行和列:
#筛选最后三行
df.iloc[-3:,:]
#筛选最后三列
df.iloc[:,-3:]
同时筛选最后三行三列
df.iloc[-3:,-3:]
1.3 iloc和loc函数的区别
之前说过loc是通过索引标签来定位的,而iloc是通过位置标签定位了,可以通过下面的例子来看出两者的区别。
首先对于导入的数据进行随机打乱:
df = df.sample(frac=1.0)
之后对于打乱的数据使用loc筛选df.loc[1:5,:]
结果为:
First_Name Gender ... Senior_Management Team
1 Thomas Male ... True NaN
719 John Male ... False Engineering
212 Lisa Female ... False Client Services
527 Helen NaN ... False Product
685 NaN Male ... NaN Finance
.. ... ... ... ... ...
361 Margaret Female ... False Sales
581 Ernest Male ... False Marketing
312 Gerald Male ... True Sales
676 Annie Female ... True Marketing
5 Dennis Male ... False Legal
[535 rows x 8 columns]
可以看到打乱顺序后loc筛选仍然是连续筛选索引为1到5之间所有的行。由于是随机打乱,所以每次运行的结果不一样,甚至可能会出现结果为空
而使用iloc筛选df.iloc[1:5,:]
结果为:
First_Name Gender ... Senior_Management Team
957 Jeffrey Male ... True Sales
82 Steven Male ... True Client Services
249 Betty Female ... True Business Development
980 Kimberly Female ... True Engineering
[4 rows x 8 columns]
即不论顺序如何变,永远选取第二行到第五行的数据。
2. 条件过滤
行列过滤的方式是基于索引和列名称来过滤的,除此之外,还可以根据列的值来过滤。
2.1 单条件
根据列的值来过滤,列的值是数值还是字符串都可以。
#筛选Bonus列大于100000的
df[df["Bonus"] > 100000]
#筛选First_Name列为Barbara的
df=df[df["First_Name"] == "Barbara"]
#筛选First_Name列中包含ice的,要先删除空子还可以使用其他的str方法设置不同的条件
df=df.dropna(subset=['First_Name'])
df=df[df["First_Name"].str.contains("ice")]
2.2 多条件
除了设置单独的条件之外,也支持通过逻辑符号&
和|
来设置多个条件。
例如筛选Salary大于149000和Gender为Female的
df[(df["Salary"] > 149000) & (df["Gender"]=="Female")]
筛选后有六行数据符合要求。
First_Name Gender ... Senior_Management Team
160 Kathy Female ... True Finance
186 NaN Female ... NaN Sales
429 Rose Female ... False Human Resources
644 Katherine Female ... False Finance
793 Andrea Female ... True Distribution
828 Cynthia Female ... False Product
[6 rows x 8 columns]
而筛选满足Salary大于149000或Gender为Female的任意一个条件的,只要将逻辑符号“与”&
改为“或”|
即可
df[(df["Salary"] > 149000) | (df["Gender"]=="Female")]
逻辑符号可以重复和嵌套使用,根据具体的逻辑编写即可。
参考文章:
https://www.cnblogs.com/wang_yb/p/17388485.html