【python资料】pandas的条件查询

news2024/12/23 22:24:46

一、说明

        在使用Pandas的DataFrame进行数据挖掘的时候,需要形形色色的条件查询,但是这些查询的基本语法是啥,查询的灵活性如何,本文将对他们进行详细列出,便于以后查阅。

二、Pandas条件查询方法

2.1 简单条件查询

        1、使用“ [] ”符号进行简单条件查询

  • 基本语法:

        

  •  例如:
import pandas as pd

df = pd.read_csv('data.csv')
df[df['col1'] > 10]  # 查询col1列中大于10的行

        表达式特点:是将由>,==,<, 等比较运算符构成表达式。

        2、用“&”连起来的多条件查询

  • 基本语法

        

        使用多个条件进行复合条件查询,是"[ ]"表达式用“&”连起来,

  • 例如:
df[(df['col1'] > 5) & (df['col2'] < 10)]  # 查询col1列中大于5且col2列中小于10的行

        3、str.contains()字符串条件查询

  • 语法

        使用str.contains()方法进行字符串条件查询,是查出字符串的子串有“apple”的行。

  • 例如:
df[df['col1'].str.contains('apple')]  # 查询col1列中包含'apple'字符串的行

        4、多个字符串内容用isin条件查询

  • 语法

         使用isin()方法进行包含查询,

  • 例如
df[df['col1'].isin(['apple', 'banana'])]  # 查询col1列中包含'apple'或'banana'的行

        5、between条件查询

        使用between()方法进行范围查询,例如:

df[df['col1'].between(5, 10)]  # 查询col1列中在5到10之间的行

        6、查询空值

        使用isna()isnull()方法进行查询空值,例如:

df[df['col1'].isna()]  # 查询col1列中为空值的行

2.2、高级查询

2.2.1 内嵌语句查询

  • 例1: 比如我想找到所有姓张的人的信息:
df[[x.startswith('张') for x in df['姓名']]]

   月份  姓名 性别  应发工资   实发工资  职位
0   1  张三  男  2000   1500  主犯
1   2  张三  男  2000   1000  主犯
2   3  张三  女  2000  15000  主犯
3   4  张三  女  2000   1500  主犯
4   5  张三  女  2000   1500  主犯

        这里stratswith方法是Python自带的字符串方法,点这里查看详细说明。

  • 还有一种方法:
criterion = df['姓名'].map(lambda x: x.startswith('张'))

df[criterion]

   月份  姓名 性别  应发工资   实发工资  职位
0   1  张三  男  2000   1500  主犯
1   2  张三  男  2000   1000  主犯
2   3  张三  女  2000  15000  主犯
3   4  张三  女  2000   1500  主犯
4   5  张三  女  2000   1500  主犯

  • 速度比较:

        # 第一种方法
        %timeit df[[x.startswith('张') for x in df['姓名']]]
        203 µs ± 8.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

        # 第二种方法
        %timeit criterion = df['姓名'].map(lambda x: x.startswith('张'))
        93.2 µs ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

        %timeit df[criterion] 
        201 µs ± 2.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

        可以看到,第二种方法实际上并没有明显快多少。并且如果加上添加检索规则的时间反而更慢。

2.2.2 可用于修改内容的where方法

  • 先看用法:

df.where(df['性别'] == '男')

     月份   姓名   性别    应发工资    实发工资   职位
0   1.0   张三    男  2000.0  1500.0   主犯
1   2.0   张三    男  2000.0  1000.0   主犯
2   NaN  NaN  NaN     NaN     NaN  NaN
3   NaN  NaN  NaN     NaN     NaN  NaN
4   NaN  NaN  NaN     NaN     NaN  NaN
5   2.0   李四    男  1800.0  1300.0   从犯
6   3.0   李四    男  1800.0  1300.0   从犯
7   4.0   李四    男  1800.0  1300.0   从犯
8   5.0   李四    男  1800.0  1300.0   从犯
9   NaN  NaN  NaN     NaN     NaN  NaN
10  NaN  NaN  NaN     NaN     NaN  NaN
11  NaN  NaN  NaN     NaN     NaN  NaN
12  NaN  NaN  NaN     NaN     NaN  NaN


        这里where的使用和直接访问标签的方式就有所不同了,这是将所有满足条件的项保持原状,而其它项全部设为NaN。如果要替换数据的话,需要比较复杂的表达式,这里只看一个简单的例子:

dates = pd.date_range('1/1/2000', periods=8)

df = pd.DataFrame(np.random.randn(8, 4),index=dates, columns=['A', 'B', 'C', 'D'])

df.where(df < 0, -df)

                   A         B         C         D
2000-01-01 -2.843891 -0.140803 -1.816075 -0.248443
2000-01-02 -0.195239 -1.014760 -0.621017 -0.308201
2000-01-03 -0.773316 -0.411646 -1.091336 -0.486160
2000-01-04 -1.753884 -0.596536 -0.273482 -0.685287
2000-01-05 -1.125159 -0.549449 -0.275434 -0.861960
2000-01-06 -1.059645 -1.600819 -0.085352 -0.406073
2000-01-07 -1.692449 -1.767384 -0.266578 -0.593165
2000-01-08 -0.163517 -1.645777 -1.509307 -0.637490

        这里插一句:实际上numpy也有where方法,用法类似,可参考:Python Numpy中返回下标操作函数-节约时间的利器

2.2.3 快速的查询方法query

df.query('姓名>性别')

    月份  姓名 性别  应发工资   实发工资  职位
2    3  张三  女  2000  15000  主犯
3    4  张三  女  2000   1500  主犯
4    5  张三  女  2000   1500  主犯
9    1  王五  女  1800   1300  龙套
10   2  王五  女  1800   1300  龙套
11   3  王五  女  1800   1300  龙套
12   4  王五  女  1800   1300  龙套

        这里,字符串的比较可以查看Python的字符串比较。当然,这里可以看到,query方法主要还是用于列的比较。

2.3 pandas中的shift()函数

  • 语法:
shift(periods, freq, axis)
  • 参数注释:
参数参数意义
period表示移动的幅度,可以是正数,也可以是负数,默认值是1,1就表示移动一次,注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。
freqDateOffset, timedelta, or time rule string,可选参数,默认值为None,只适用于时间序列,如果这个参数存在,那么会按照参数值移动时间索引,而数据值没有发生变化。
axis0为垂,1为水平
  • 实例代码 
# 表格数据生成
import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame(np.arange(16).reshape(4,4),columns=['A','B','C','D'],index=pd.date_range('20130101', periods=4))

>>>df
           A	B	C	D
2013-01-01	0	1	2	3
2013-01-02	4	5	6	7
2013-01-03	8	9	10	11
2013-01-04	12	13	14	15

#默认是axis = 0轴的设定,当period为正时向下移动
# 表示表格从原始数据第二行开始有效
df.shift(2)
A	B	C	D
2013-01-01	NaN	NaN	NaN	NaN
2013-01-02	NaN	NaN	NaN	NaN
2013-01-03	0.0	1.0	2.0	3.0
2013-01-04	4.0	5.0	6.0	7.0
#默认是axis = 0轴的设定,当period为负时向下移动
df.shift(-2)
​
A	B	C	D
2013-01-01	8.0	9.0	10.0	11.0
2013-01-02	12.0	13.0	14.0	15.0
2013-01-03	NaN	NaN	NaN	NaN
2013-01-04	NaN	NaN	NaN	NaN
#axis = 1,当period为正向右,为负向左移动
df.shift(2,axis=1)
A	B	C	D
2013-01-01	NaN	NaN	0.0	1.0
2013-01-02	NaN	NaN	4.0	5.0
2013-01-03	NaN	NaN	8.0	9.0
2013-01-04	NaN	NaN	12.0	13.0
# frep参数决定索引为日期,正加负减
df.shift(freq=datetime.timedelta(1))
A	B	C	D
2013-01-02	0	1	2	3
2013-01-03	4	5	6	7
2013-01-04	8	9	10	11
2013-01-05	12	13	14	15
df.shift(freq=datetime.timedelta(-1))
A	B	C	D
2012-12-31	0	1	2	3
2013-01-01	4	5	6	7
2013-01-02	8	9	10	11
2013-01-03	12	13	14	15

        除了上述方法之外,还有:query方法的条件处理、MultiIndex情况下的处理、get方法、lookup方法等等

三、更多内容

(更新中..)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「API接口的技术说明文档

API技术文档是指软件系统或应用程序的API接口的技术说明文档。它详细描述了API端点&#xff0c;资源&#xff0c;参数&#xff0c;请求和响应格式以及使用API的常见用例和最佳实践。 1.为什么需要API技术文档&#xff1f; API技术文档是API的唯一方法&#xff0c;以便开发人员…

分享18个好用的ChatGPT插件

上周ChatGPT又进化了&#xff0c;支持联网还有70几种第三方插件&#xff0c;不过还是老样子&#xff0c;只服务氪金玩家&#xff0c;免费端可能还得等等。之前只开放了俩插件&#xff0c;网络浏览器和代码解释器&#xff0c;只能说是真的不够用。 ChatGPT&#xff1a;不够&…

中间件(三)- Kafka(二)

Kafka 6. 高效读写&Zookeeper作用6.1 Kafka的高效读写6.2 Kafka中zookeeper的作用 7. 事务7.1 Producer事务7.2 Consumer事务 8. API生产者流程9. 通过python调用kafka9.1 安装插件9.2 生产者&#xff08;Producer&#xff09;与消费者&#xff08;Consumer&#xff09;9.3…

【实验】SegViT: Semantic Segmentation with Plain Vision Transformers

想要借鉴SegViT官方模型源码部署到本地自己代码文件中 1. 环境配置 官网要求安装mmcv-full1.4.4和mmsegmentation0.24.0 在这之前记得把mmcv和mmsegmentation原来版本卸载 pip uninstall mmcv pip uninstall mmcv-full pip uninstall mmsegmentation安装mmcv 其中&#xff…

你若在患难之日胆怯,你的力量便微小

如果你在做一件事情之前就过分放大它的困难&#xff0c;这就会逐渐降低自己去做它的动机和动力&#xff0c;还没开始你就已经削弱了自己的行动能力&#xff0c;在气势上就已经输了。 不要害怕困难&#xff0c;勇敢的去面对问题&#xff0c;解决问题&#xff0c;你就会在气势上更…

RK平台烧录固件的几种模式

在RK平台开发过程中&#xff0c;我们在使用烧录工具烧写固件的时候经常可以看到烧录工具会显示当前PC识别到的设备类型&#xff0c;一般有&#xff1a;MASKROM&#xff0c;LOADER&#xff0c;ADB&#xff0c;MSC等等。能烧录固件的模式有MASKROM模式和LOADER模式&#xff0c;下…

Python基础教程:第八章_Python文件操作

文件的编码 学习目标 掌握文件编码的概念和常见编码 思考&#xff1a;计算机只能识别&#xff1a;0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢&#xff1f; 答案&#xff1a;使用编码技术&#xff08;密码本&#xff09;将内…

STM32WB55_NUCLEO开发(12)----FUS 更新

概述 在 STM32WB 微控制器中&#xff0c;FUS&#xff08;Firmware Upgrade Services&#xff09;是用于固件升级的一种服务。这项服务可以让你更新设备上的无线栈固件&#xff08;如蓝牙、Zigbee或 Thread 栈&#xff09;&#xff0c;以及无线 MCU (microcontroller unit) 的系…

day5 - 利用阈值勾勒

阈值处理在计算机视觉技术中占有十分重要的位置&#xff0c;他是很多高级算法的底层逻辑之一。本实验将练习使用图像阈值处理技术来处理不同的情况的图像&#xff0c;并获得图像轮廓。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像阈值处理技术的定义和作用 掌握各阈…

PyQt5 使用 pyinstaller打包文件(speed)

编写界面 import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt from PyQt5.QtGui import *class RightBottomButton(QWidget) :def __init__(self):super(RightBottomButton,self).__init__()self.setWindowTitle("界面One")self.resize(400…

1.8G专网工业路由器促进4G智能电力建设,赋能配电站远程监控管理

TD-LTE已是当下成熟的4G通信技术&#xff0c;应用无线专网的场景也越来越多&#xff0c;4G技术在电力物联网中也得到了广泛应用。依托传统的人工监管方式&#xff0c;效率低、成本高、维护难&#xff0c;为促进4G智能电力建设迫切需要方便快捷的在线监控方式来及时发现电力配网…

xss跨站,订单,shell箱子反杀记

打开一个常见的订单靶场&#xff0c;老师自己搭建的 这个是可以进行xss漏洞的测试&#xff0c;凡是有这种数据交互的地方&#xff0c;前端有一个数据的接受&#xff0c;后端是数据的显示&#xff0c;这个过程就符合漏洞产生的前提条件&#xff0c;将输入的数据进行个显示&#…

BUUCTF-Basic部分(4道)

目录 Linux Labs BUU LFI COURSE 1 BUU BRUTE 1 BUU SQL COURSE 1 Linux Labs 第一个界面&#xff0c;给出了SSH ssh 用户名&#xff1a;root 密码&#xff1a;123456 地址和端口为动态分配的 以及映射地址和端口&#xff08;这个地址端口是随机的&#xff09; node4.buuoj.c…

R语言实践——使用 rWCVP 生成自定义清单

使用 rWCVP 生成自定义清单 介绍1. 特有物种清单2. 近特有物种清单2.1 在塞拉利昂和另一地区出现的物种2.2 在塞拉利昂和相邻地区出现的物种 3. 生成自定义报告 介绍 除了允许用户从世界维管植物名录&#xff08;WCVP&#xff09;创建清单外&#xff0c;rWCVP还提供了修改清单…

在小公司“混”了2年,我只认真做了5件事,如今顺利拿到字节 Offer

前言 是的&#xff0c;我一家小公司工作了整整两年时间&#xff0c;在入职这家公司前&#xff0c;也就是两年前&#xff0c;我就开始规划了我自己的人生&#xff0c;所以在两年时间里&#xff0c;我并未懈怠。 现如今&#xff0c;我已经跳槽到了字节&#xff0c;入职字节测试…

傅里叶级数 傅里叶变换 及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具&#xff0c;它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号&#xff0c;可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

Netty编解码机制(二)

1.Netty入站和出站机制 1.1.基本介绍 1>.netty的组件设计: Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等; 2>.ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器.例如,实现ChannelInboundHandler接口(或ChannelInb…

Unity之如何接入google cardboard-xr-plugin实现android手机VR

前言 我们提到VR,总是会想到Oculus,HTC Vive,Pico等头戴VR设备,但是别忘了,最早Google就通过再手机端实现VR了,而且还推出过Cardboard手机盒子,让我们可以用最低的成本体验到VR效果。 插件下载 先说明一下,Unity在1028版本之前,支持过GoogleVR,但是后来因为统一…

Chapter8 :Physical Constraints(ug903)

8.1About Physical Constraints&#xff08;关于物理约束&#xff09; XilinxVivado集成设计环境&#xff08;IDE&#xff09;允许通过设置对象属性值对设计对象进行物理约束。示例包括&#xff1a; •I/O约束&#xff0c;如位置和I/O标准 •布局约束&…

惨败字节,苦心备战两个月斩获阿里offer,这份“258页软件测试面试宝典”也太顶了

测试三年有余&#xff0c;很多新学到的技术不能再项目中得到实践&#xff0c;同时薪资的涨幅很低&#xff0c;于是萌生了跳槽大厂的想法。 但大厂不是那么容易进的&#xff0c;前面惨败字节&#xff0c;为此我辛苦准备了两个月&#xff0c;又从小公司开始面试了半个月有余&…