过滤 Pandas DataFrame 的 20 种方法

2023-10-20

蟒蛇的Pandas是一个用于数据操作和分析的强大库。其主要功能之一是能够从 Pandas DataFrame 中过滤数据。在 Pandas 中过滤数据有很多不同的方法。

它使您能够检查特定行或数据子集,按列或多列过滤 Pandas DataFrame,甚至根据条件或给定条件列表过滤 Pandas Dataframe。

在本教程中,我们将探索以下过滤 Pandas DataFrame 的方法。

 

 

进口熊猫

首先,我们需要导入 Pandas 包。这通常通过以下命令完成:


import pandas as pd  

 

创建示例数据框

We can 创建一个简单的数据框对于本教程:


data = {
    'Name': ['Alex', 'John', 'Richard', 'Tom', 'Kim', 'Lily', 'Emma', 'Jack'],
    'Age': [23, 34, 30, 28, 32, 26, 29, 25],
    'City': ['New York', 'London', 'London', 'Paris', 'Berlin', 'Berlin', 'London', 'New York'],
    'Gender': ['M', 'M', 'M', 'M', 'F', 'F', 'F', 'M']
}

df = pd.DataFrame(data)

# Display the first five rows of the dataframe
print(df.head())  

这将返回以下输出:


    Name  Age       City Gender
0   Alex   23   New York      M
1   John   34     London      M
2 Richard   30     London      M
3    Tom   28      Paris      M
4    Kim   32     Berlin      F  

在上面的代码中,我们从 Python 字典创建了一个 DataFrame,并使用 head 方法仅打印前五行。

 

根据单列值过滤行

您可以根据列中的特定值过滤 Pandas DataFrame 行。例如,要过滤“Gender”为“M”的行:


df_filtered = df[df['Gender'] == 'M']
print(df_filtered)  

这将返回:


     Name  Age      City Gender
0    Alex   23  New York      M
1    John   34    London      M
2 Richard   30    London      M
3     Tom   28     Paris      M
7    Jack   25  New York      M  

 

使用多个列值过滤行

要根据多个列值过滤行,您可以使用多个条件:


df_filtered = df[(df['Gender'] == 'M') & (df['Age'] > 30)]
print(df_filtered)  

结果将是:


   Name  Age     City Gender
1  John   34   London      M  

在这里,我们过滤 DataFrame 并仅返回 Gender =“M”且年龄大于 30 的行。

 

使用逻辑运算符(AND、OR、NOT)过滤行

Pandas 允许使用逻辑运算符(& 表示 AND,| 表示 OR,~ 表示 NOT)来过滤 DataFrame。在这里,我们过滤“性别”为“M”或“城市”为“纽约”的行:


df_filtered = df[(df['Gender'] == 'M') | (df['City'] == 'New York')]
print(df_filtered)  

这将返回:


     Name  Age      City Gender
0    Alex   23  New York      M
1    John   34    London      M
2 Richard   30    London      M
3     Tom   28     Paris      M
7    Jack   25  New York      M  

 

根据空值或缺失值过滤行

您可以根据空值或缺失值过滤 DataFrame 行。在 Pandas 中,NaN(非数字)用于表示缺失值。您可以使用isnull过滤包含缺失值的行的函数:


df_filtered = df['Age'].isnull()
print(df_filtered)  

这将返回一个系列,其中包含缺失值的行为“True”,没有缺失值的行为“False”:


0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
Name: Age, dtype: bool  

 

使用 isin 方法过滤行

The isin方法用于根据值列表过滤行。它返回一个为 True 的布尔系列,其中列值位于给定列表中,并使用此布尔系列来选择仅具有 True 的行:


df_filtered = df[df['City'].isin(['London', 'Berlin'])]
print(df_filtered)  

这将为我们提供:


      Name  Age    City Gender
1     John   34  London      M
2  Richard   30  London      M
4      Kim   32  Berlin      F
5     Lily   26  Berlin      F
6     Emma   29  London      F  

 

基于正则表达式 (Regex) 过滤行

Pandas 允许使用正则表达式过滤 DataFrame 行。这str.contains通过将 regex 参数设置为 True,函数可以与正则表达式模式一起使用:


df_filtered = df[df['Name'].str.contains('^A', regex=True)]
print(df_filtered)  

这是生成的数据框:


   Name  Age      City Gender
0  Alex   23  New York      M  

 

使用 loc 函数过滤行

The loc函数用于根据列的标签过滤行。它还可以接受布尔数据,允许它与逻辑运算符一起使用:


df_filtered = df.loc[df['Age'] > 30]
print(df_filtered)  

这导致:


   Name  Age    City Gender
1  John   34  London      M
4   Kim   32  Berlin      F  

这里我们只返回年龄大于 30 的行。

 

使用 iloc 函数过滤行

The iloc函数用于根据位置过滤行:


df_filtered = df.iloc[0:5]
print(df_filtered)  

这将返回 DataFrame 的前五行:


     Name  Age      City Gender
0    Alex   23  New York      M
1    John   34    London      M
2 Richard   30    London      M
3     Tom   28     Paris      M
4     Kim   32    Berlin      F  

上面的代码返回位置在 0 到 5 之间的行。 iloc 从零开始,因此它从位置零开始计数。

 

使用波形符 (~) 运算符过滤行

波形符 (~) 运算符用于过滤不符合条件的行:


df_filtered = df[~(df['City'] == 'New York')]
print(df_filtered)  

生成的 DataFrame 将是:


      Name  Age    City Gender
1     John   34  London      M
2  Richard   30  London      M
3      Tom   28   Paris      M
4      Kim   32  Berlin      F
5     Lily   26  Berlin      F
6     Emma   29  London      F  

这里的代码仅返回 City 不是“New York”的行。

 

使用关系运算符(、=、==)

您还可以使用关系运算符过滤行:


df_filtered = df[df['Age'] > 30]
print(df_filtered)  

这将返回:


   Name  Age    City Gender
1  John   34  London      M
4   Kim   32  Berlin      F  

正如您所看到的,它返回年龄大于 30 的行。

 

根据值范围过滤行

要过滤特定值范围内的行:


df_filtered = df[(df['Age'] >= 25) & (df['Age'] <= 30)]
df_filtered  

这将导致:


   Name  Age  City  Gender
2  Richard  30 London  M
3  Tom  28  Paris  M
5  Lily 26  Berlin  F
6  Emma  29  London  F
7  Jack 25  New York  M  

上面的代码返回年龄大于或等于 25 且小于或等于 30 的行。

 

根据索引标签过滤行

Pandas DataFrame 有一个Index对象,它允许我们使用索引标签快速选择行loc功能:


df_filtered = df.loc[[0, 2, 4]]
print(df_filtered)  

这将为我们提供:


     Name  Age      City Gender
0    Alex   23  New York      M
2 Richard   30    London      M
4      Kim   32   Berlin      F  

如您所见,我们选择了索引为 0、2、4 的行。

 

使用自定义函数过滤行

您还可以使用自定义函数来过滤行:


def filter_func(row):
    return row['Name'].startswith('A')

df_filtered = df[df.apply(filter_func, axis=1)]
print(df_filtered)  

这将返回:


   Name  Age      City Gender
0  Alex   23  New York      M  

在这里,我们定义了一个函数并过滤了名称以字母“A”开头的行。

 

使用列名称过滤列

您可以使用列名称过滤列:


df_filtered = df[['Name', 'Age']]
print(df_filtered)  

输出将是:


     Name  Age
0    Alex   23
1    John   34
2 Richard   30
3     Tom   28
4     Kim   32
5     Lily   26
6     Emma   29
7    Jack   25  

正如您所看到的,我们只返回两列“Name”和“Age”。

 

使用正则表达式 (Regex) 过滤列

您可以使用正则表达式来过滤列:


df_filtered = df.filter(regex='^N')
print(df_filtered)  

这将返回:


     Name
0    Alex
1    John
2 Richard
3     Tom
4     Kim
5     Lily
6     Emma
7    Jack  

上面的代码过滤列名以字母“N”开头的列。

 

按行和列过滤数据

您可以使用以下命令过滤行和列loc功能:


df.loc[df['Age'] > 30, ['Name', 'City']]  

这将返回:


   Name    City
1  John  London
4   Kim  Berlin  

上面的代码仅返回年龄大于 30 岁的行,并且仅获取“姓名”和“城市”。

 

根据特定条件过滤行和列

您可以使用特定条件来过滤行和列:


df_filtered = df.loc[df['Age'] > 30, df.columns.str.startswith('N')]
print(df_filtered)  

这将返回:


     Name
1    John
4     Kim  

这里我们有一个混合条件,返回 Age 大于 30 的行,并且只获取 Name 列。

 

按两列中的条件过滤 DataFrame 行

您可以根据两列中的条件过滤 DataFrame 行:


df_filtered = df[(df['Age'] > 30) & (df['City'] == 'London')]
print(df_filtered)  

这将返回:


   Name  Age    City Gender
1  John   34  London      M  

这里两个条件都属于列。我们得到年龄大于 30 且城市=“伦敦”的行。

 

使用查询方法过滤 DataFrame 行

您可以使用query方法通过将条件作为字符串传递来过滤 DataFrame 行,如下所示:


df_filtered = df.query("Age > 30 and City == 'London'")
print(df_filtered)  

这将返回:


   Name  Age    City Gender
1  John   34  London      M  

 

过滤 Pandas DataFrame 救了我

我有无数的故事,讲述了 Python(特别是 Pandas 包)的强大功能如何极大地减少了数据操作任务所需的时间和精力。

但有一个故事很引人注目。这个故事讲述的是我当时正在从事一个巨大的自由项目,该项目需要筛选大量数据集并执行复杂的数据过滤。

该项目涉及分析包含国际电子商务公司历史销售数据的数据集。

该数据集包含超过 1000 万行,其中数十列代表各种数据点,例如产品 ID、客户 ID、销售区域、产品类别、销售日期等。目标是执行有针对性的销售分析,这需要根据多个条件提取特定的数据子集。

想象一下手动浏览数百万条记录并尝试提取特定子集。这将是一场噩梦!这就是 Pandas DataFrame 过滤可以发挥作用的地方。

该项目的一部分需要识别来自特定地区(例如“北美”)的客户,这些客户在“电子”类别中购买的商品金额超过一定金额(例如 500 美元)。

借助 Pandas DataFrame 过滤的强大功能,我只需一行代码即可完成此操作:


df_filtered = df[(df['Region'] == 'North America') & (df['Purchase Amount'] > 500) & (df['Category'] == 'Electronics')]  

该行过滤掉了大约 50,000 笔符合指定条件的交易——仅占整个数据集的 0.5%,但对于目标分析来说非常有价值。

该项目的另一个关键部分涉及时间序列分析。我需要分析每个产品类别的每月销售趋势。问题在于“销售日期”列采用字符串格式,并且包含日期和时间,这对于此分析来说是不必要的。

以下是我用 Pandas 解决这个问题的方法:


df['Sale Date'] = pd.to_datetime(df['Sale Date']).dt.to_period('M')  

然后,过滤特定月份的数据:


df_filtered = df[df['Sale Date'] == '2023-01']  

在另一个例子中,我被要求根据总购买金额关注前 1% 的客户。感谢 Pandas,这看起来就像小孩子的游戏:


top_customers = df.groupby('Customer ID')['Purchase Amount'].sum().nlargest(int(0.01*df['Customer ID'].nunique()))  

每个过滤操作只需要几秒钟即可运行。

 

结论

本教程介绍了过滤 Pandas DataFrame 中数据的各种方法。过滤数据是数据分析和准备的关键步骤,Pandas 为这项任务提供了强大而灵活的工具包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

过滤 Pandas DataFrame 的 20 种方法 的相关文章

  • 如何让我的精灵向鼠标位置发射一个对象?

    对于一个学校项目 我需要通过实现一种向鼠标位置射击 Kunais Shurikens 的方式来完成下面的 pygame 程序 以便能够击中敌人精灵 import pygame import math import random from p
  • 用顶点之间的渐变填充 matplotlib 多边形

    我正在使用 matplotlib 的 Poly3DCollection 绘制多边形 三角形 的集合 三角形位于具有与其关联的颜色的顶点之间 我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形 绘制三角形以形成 3D 表面网格 I w
  • 通过getattr动态获取dict元素?

    我想动态查询我想要检索的类中的哪些对象 getattr似乎是我想要的 并且它对于类中的顶级对象表现良好 但是 我还想指定子元素 class MyObj object def init self self d a 1 b 2 self c 3
  • 对自定义类进行排序而不使用“key”参数?

    您可以对数组进行排序myclass通过使用key论证sorted功能 sortedlist sorted myclasses key lambda obj obj myproperty 有没有办法为我们的班级定义自然顺序 也许有一些神奇的方
  • 将ast节点转换为python对象

    给定一个ast可以自行计算的节点 但字面意义不够ast literal eval例如列表理解 src i 2 for i in range 10 a ast parse src Now a body 0 is an ast Expr and
  • 如何从 Django 中的 ModelForm 手动创建选择字段?

    我有一个ModelForm其中字段之一 名为creator is a ForeignKey 因此对于 form creator Django 渲染
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基
  • 使用 QtDesigner 的 pyQt 信号/槽

    我正在尝试编写一个与 QGraphicsView 交互的程序 我想在 QGraphicsView 中发生事件时收集鼠标和键盘事件 例如 如果用户单击 QGraphicsView 小部件 我将获得鼠标位置 类似的东西 我可以很容易地对其进行硬
  • Pytorch CUDA 错误:没有内核映像可用于在带有 cuda 11.1 的 RTX 3090 设备上执行

    如果我运行以下命令 import torch import sys print A sys version print B torch version print C torch cuda is available print D torc
  • 如何加载 caffe 模型并转换为 numpy 数组?

    我有一个 caffemodel 文件 其中包含 ethereon 的 caffe tensorflow 转换实用程序不支持的层 我想生成我的咖啡模型的 numpy 表示 我的问题是 如何将 caffemodel 文件 我还有 prototx
  • 如何更新 certifi 的根证书?

    我正在使用 certifi python 模块来验证 ssl 连接 我查看了 certifi python2 7 site packages certifi cacert pem 中包含的根证书 其中一些证书已过期 我如何更新这些证书 我尝
  • Linux 中如何确定哪个进程正在使用某个端口

    我目前正在其默认端口上运行 RethinkDB 因为如果我将浏览器指向localhost 8080我看到 RethinkDB Web 界面 我想关闭 RethinkDB 并使用以下命令在另一个端口上重新打开它 port offset争论 然
  • 如何在关心 NaN 值的同时获取数据框中值的百分比变化?

    我有以下数据框 Date A 2015 01 01 10 2015 01 02 14 2015 01 05 NaN 2015 01 06 NaN 2015 01 07 5 2015 01 10 1 2015 01 11 NaN 2015 0
  • 如果 Django 中的表单字段与 Python 关键字同名,如何声明该字段?

    我在 Django 中有一个简单的表单 看起来像这样 class SearchForm forms Form text forms CharField from forms DateField until forms DateField 失
  • 在 python matplotlib 中格式化损坏的 y 轴

    我正在 matplotlib 中处理一个 相当复杂的 条形图 它包含来自多个源的摘要数据 每个源都沿 x 轴标记 y 轴上有一系列结果 许多结果都是异常值 我尝试使用断开的 y 轴来显示这些结果 而不会使用以下组合来扭曲整个图表这个方法 h
  • Python 中字典的 enumerate()

    我知道我们用enumerate用于迭代列表 但我在字典上尝试过 但没有给出错误 CODE enumm 0 1 1 2 2 3 4 4 5 5 6 6 7 7 for i key in enumerate enumm print i key
  • 如何将目录导入为 python 模块

    如果有目录 home project aaa 我知道它是一个Python包 那么 我如何通过知道它的路径来导入这个模块 这意味着 我希望代码能够正常工作 aaa load module home project aaa 我知道的唯一方法是
  • 为什么“模型尚未加载”?

    我正在尝试使用 customUser 安装 django registration redux 我已将其包含在我的 settings py 中 AUTH USER MODEL app customUser 注册表位于目录 registrat
  • App Engine、PIL 和叠加文本

    我正在尝试在 GAE 上的图像上覆盖一些文本 现在他们公开了 PIL 库 这应该不是问题 这就是我所拥有的 它有效 但我不禁认为我应该直接写入背景图像 而不是创建单独的覆盖图像然后合并 我可以用吗Image frombuffer http
  • Python TDD 目录结构

    Python 中是否有用于 TDD 的特定目录结构 教程讨论测试的内容 但不讨论测试的位置 通过研究 Python Koans 怀疑它是这样的 project main program py This has main method sta

随机推荐

  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引
  • Bash While 循环:从基础知识到实际应用

    In Bash 脚本 while 循环用于在指定条件为 true 时执行语句块 基本语法是 while CONDITION do Commands to be executed done 只要 CONDITION 计算结果为 true 循环
  • 使用 Pandas DataFrame iloc 属性进行基于索引的访问

    The iloc财产在Pandas库代表 整数位置 并提供基于整数的索引以按位置进行选择 这意味着您可以通过整数位置选择 DataFrame 中的行和列 在本教程中 我们将介绍使用的各个方面iloc 包括选择单行 多行 特定列 甚至单个单元
  • Python defaultdict 简介:类固醇词典

    在Python中 defaultdict是一个类似于字典的类collections模块允许我们为字典中未显式设置的键定义默认值 它是内置的子类dict class Both dict and defaultdict用于以键值对格式 Pyth
  • 19 个有用的 Linux 命令行提示和技巧

    您可能已经注意到 Linux 是一个非常复杂的操作系统 因此 当发生的事情太多时 工作可能会变得有点乏味 但这正是 Linux 的自然之美的闪光点 有许多技巧和快捷方式可以在命令行中使用 以提供额外的便利 这一系列的技巧包括方便的命令和巧妙
  • Python 编程基础知识与示例

    Python 是一种流行且功能强大的脚本语言 可以做任何事情 您可以执行网页抓取 网络工具 科学工具 Raspberry Pi 编程 Web 开发 视频游戏等等 通过Python编程 无论您使用什么平台 您甚至可以进行系统编程 说到机器学习
  • 退出/终止 Python 脚本(简单示例)

    今天 我们将深入探讨退出 终止 Python 脚本的主题 您可以使用您选择的 IDE 但这次我将使用 Microsoft 的 Linux Subsystem for Windows WSL 软件包 有关该功能以及如何在 Windows 10
  • 使用 Pandas read_sql 将 SQL 查询/表读入 DataFrame

    The read sql函数允许您将数据从 SQL 数据库直接加载到Pandas数据框 它允许您直接解析和执行 SQL 查询或将整个表读入数据框 通过使用pandas read sql 您正在 SQL 数据库和 Pandas 之间建立无缝桥
  • 在 Linux 中使用 for 循环迭代文件

    在 Linux 中循环文件是一项方便的技能 它可以帮助您更轻松地管理和组织文件 在本教程中 我们将学习如何使用 Bash 循环文件 我们将看看如何使用for loop迭代常规文件 名称中带有空格的文件 目录 忽略大小写等等 在本教程结束时
  • 使用 to_gbq 将 Pandas DataFrame 导出到 Google BigQuery

    The to gbq功能允许您从a上传数据Pandas到 BigQuery 表中 在本教程中 您将学习如何从 Pandas 导出数据数据框使用 BigQueryto gbq功能 目录 hide 1 安装所需的库 2 设置 Google Cl
  • 在 Python 中创建 Pandas DataFrame 的 14 种方法

    A pandasDataFrame是一种二维标记数据结构 可以容纳整数 字符串 浮点等不同类型的数据 在本教程中 我们将揭示创建 pandas DataFrame 的几种不同方法 使用列表 字典 系列等数据结构 NumPy 数组 甚至其他
  • 过滤 Pandas DataFrame 的 20 种方法

    蟒蛇的Pandas是一个用于数据操作和分析的强大库 其主要功能之一是能够从 Pandas DataFrame 中过滤数据 在 Pandas 中过滤数据有很多不同的方法 它使您能够检查特定行或数据子集 按列或多列过滤 Pandas DataF