Pandas数据筛选过滤(一):基础过滤方法

pandas的数据筛选,过滤,检索功能是其最基础也是最重要的功能之一。

在pandas中最常用的几种数据过滤方式如下:

  1. 行列过滤:选取指定的行或者列
  2. 条件过滤:对列的数据设置过滤条件
  3. 函数过滤:通过函数设置更加复杂的过滤条件

在开始之前,本篇文章使用的测试数据下载地址为: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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smilecoc

谢谢老板,祝老板工作学习顺利!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值