pandas增强—数据表的非等式连接和条件连接。

news2024/9/23 9:34:20

Pandas 支持 equi-join,其中 join 中涉及的键被认为是相等的。这是通过 merge 和 join 函数实现的。但是,在某些情况下,所涉及的Key可能不相等;联接中还涉及一些其他逻辑条件、这称为非等式连接或不等式连接或者条件连接。

这种情况下使用pandas来的话得可以从以下2个方面着手。
1、先建立笛卡尔连接然后筛选。缺点是性能很差。
2、对于时间序列可以使用asof来连接。缺点是功能受限,不是所有的条件筛选都能用asof,特别是非时间序列的情况下。

解决方案
1、使用DuckDB 的 SQL 查询 DataFrame,性能极高。
2、使用pandas的功能增强库pyjanitor 库的 conditional_join 函数,既节省内存又不损性能;‘

解决方案一:
由于DuckDB是一个比较火热的项目已经成为的Python数据库。考虑到性能和代码的维护主要推荐这种方式
映入DuckDB的python库,拼接字符串为SQL语句,然后查询。
解决方案二:
该方案的有优点是代码和pandas高度兼容,如果只做简单的不等连接可以使用,复杂的条件还需要DuckDB。
可以参考下面的文章。这篇文章的主要价值在于描述了条件筛选的主要用法,相比与使用pyjanitor 我更倾向于使用DuckDB库的SQL方法。
https://samukweku.github.io/data-wrangling-blog/notebooks/Fast-and-Efficient-Inequality-Joins-in-Pandas.html
为了避免外网站打不开我接了图。在这里插入图片描述

对于使用到的pyjanitor 库,它是一个从R迁移来的python库,主要有以下3方面的功能
https://pyjanitor-devs.github.io/pyjanitor/api/io/
1、条件连接、不等式连接conditional_join。主要功能
2、对pandas读取csv和excel在功能上的增强,如一次读取多个sheet的excelAPI :xlsx_table(path, sheetname, table=None),读取多个csv等 API:read_csvs(files_path, separate_df=False, **kwargs)。次要功能,这些功能在pandas也较为容易实现,没必要多引入库和API。
3、数据清洗。主要是对空值、列的增删的处理,和各个行业(如金融)等封装的清洗方法。个人认为用处不大,提供的功能多数pandas都能实现,还得多记API。
4、其他可能有用的功能
https://www.cnblogs.com/feffery/p/15998079.html

利用also()方法穿插执行任意函数#
 pyjanitor中的also()方法允许在pandas链式过程中随意插入执行任意函数,接受上一步状态的数据框运算结果,且不影响对下一步处理逻辑的数据输入,我非常喜欢这个功能,下面是一个简单的例子:

df = (
    # 构造示例数据框
    pd.DataFrame({"a": [1, 2, 3], "b": list("abc")})
    .query("a > 1")
    # 利用also()插入lambda函数接受上一步的输入对象
    .also(lambda df: print(f"a字段<=1的记录有{df.query('a <= 1').shape[0]}行"))
    .rename(columns={'a': 'new_a'})
    # 利用also()实现中间计算结果的导出
    .also(lambda df: df.to_csv("temp.csv", index=False))
    # 利用also()打印到这一步时数据框计算结果的字段名
    .also(
        lambda df: print(f"字段名:{df.columns.tolist()}")
    )
    .drop(columns='b')
)

2、利用case_when()方法实现多条件分支#
  pyjanitor中的case_when()方法可以帮助我们针对数据框实现类似SQL中的的多条件分支运算,注意,因为是多条件分支,所以包含最后的“其他”条件在内,需要至少定义3条分支规则,参考下面的例子:

df = pd.DataFrame(
{
“a”: [0, 0, 1, 2],
“b”: [0, 3, 4, 5],
“c”: [6, 7, 8, 9],
}
)

df.case_when(
((df.a == 0) & (df.b == 0)), ‘类别1’,
((df.a == 0) & (df.b != 0)), ‘类别2’,
# 其他情况
‘类别3’,
column_name=“类别”,
)

3、利用move()方法快捷完成字段位置调整
  pyjanitor中的move()方法用于快捷调整某行或某列数据的位置,通过source参数指定需要移动的数据行index或列的字段名,target参数用于指定移动的目标位置数据行index或列的字段名,position用于设置移动方式('before’表示移动到目标之前一个位置,after表示后一个位置),axis用于设定移动方式(0表示行移动,1表示列移动)。

以最常用的列移动为例:

df = pd.DataFrame({"a": [2, 4, 6],"b": [1, 3, 5],"c": [7, 8, 9]})

在这里插入图片描述

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

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

相关文章

vue-echarts踩坑,本地开发可以渲染echarts图表,线上环境图表渲染不出来

main.js全局注册v-chart组件 import VueECharts from "vue-echarts"; Vue.component("v-chart", VueECharts);在页面中使用 如上图&#xff0c;我开始写的静态数据&#xff0c;在data中定义了chartOption1:{…配置项…}, 在接口数据返回之后&#xff0c;…

学习笔记-MySql数据库介绍与连接

一.MySQL数据库介绍 MySQL是一个关系型数据库管理系统&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件&#xff0c;它是由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

高工微报告|智驾前视一体机趋势

传统智驾前视一体机赛道上&#xff0c;1V3R、1V5R产品如何升级备受关注。 根据日前调研获取的信息&#xff0c;1V3R、1V5R向轻量级行泊一体&#xff08;典型为5V5R12U方案&#xff0c;算力平台5-20TOPS&#xff09;迈进的具体市场空间&#xff0c;仍在验证阶段。 其中&#x…

【MIdjourney】镜头效果关键词

1.景深(depth of field) 景深&#xff08;DOF&#xff09;&#xff0c;是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头距离、及焦平面到拍摄物的距离是影响景深的重要因素。 在MIdjourney中&#xff0c;该关键字会使得…

支付功能测试用例测试点?

支付功能测试用例测试点是指在测试支付功能时&#xff0c;需要关注和验证的各个方面。根据不同的支付场景和需求&#xff0c;支付功能测试用例测试点可能有所不同&#xff0c;但一般可以分为以下几类&#xff1a; 功能测试&#xff1a;主要检查支付功能是否符合设计和业务需求…

Vue-16、Vue列表渲染(v-for的使用)

1、vue遍历数组 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>列表渲染</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"…

Jenkins使用随笔

1、如果要部署的springboot程序和jenkins在同一台linux上&#xff0c;需要增加一条 export BUILD_IDtomcat_mobile_build_id 如下图&#xff1a; 原因是&#xff1a;jenkins在执行sh脚本的时候&#xff0c;如果脚本中有启动后台进程的情况&#xff0c;例如tomcat的关闭和启动…

FEB(acwing)

文章目录 FEB题目描述输入格式输出格式数据范围输入样例1&#xff1a;输出样例1&#xff1a;输入样例2&#xff1a;输出样例2&#xff1a;输入样例3&#xff1a;输出样例3&#xff1a;代码题解情况1&#xff1a;xxxxxx&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;…&a…

C#MQTT编程02--报文格式

1、报文结构 在MQTT协议中&#xff0c;一个MQTT数据包由&#xff1a;固定头&#xff08;Fixed header&#xff09;、可变头&#xff08;Variable header&#xff09;、消息体&#xff08;Payload&#xff09;三部分构成。 注意2点&#xff1a; 1&#xff09;所有的数据包结构…

【国产车规级SoC芯片型号介绍-LT9211】

近日&#xff0c;龙迅半导体股份有限公司宣布推出LT9211系列车规级SoC芯片——LT9211。该芯片提供7.5*7.5mm封装&#xff0c;可满足对于尺寸及空间比较敏感的车身域和辅助驾驶域节点执行器需求。 龙迅半导体持续完善现有车规产品阵容布局&#xff0c;本次发布的车规级SoC芯片L…

【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(文件处理指令-上)

文件处理指令-上 背景前言专栏介绍面向对象重点内容文件处理命令file格式[options] 主要参数简单说明使用案例 mkdir格式[options] 主要参数应用实例 grep格式主要参数[optionsl 主要参数 应用实例pattern正则表达式主要参数 应用实例fgrep和egrep dd格式[options]主要参数 应用…

5 微信小程序

功能开发 5 功能开发概要今日详细1.发布1.1 发布流程的问题1.2 组件&#xff1a;进度条1.3 修改data中的局部数据1.4 发布示例效果前端后端 1.5 闭包 2.获取前10条新闻&#xff08;动态/心情&#xff0c;无需分页&#xff09;3.复杂版4.文章详细页面 各位小伙伴想要博客相关资料…

函数式编程 - 组合compose的使用方法

函数式编程中有一个比较重要的概念就是函数组合&#xff08;compose&#xff09;,组合多个函数&#xff0c;同时返回一个新的函数。调用时&#xff0c;组合函数按顺序从右向左执行。右边函数调用后&#xff0c;返回的结果&#xff0c;作为左边函数的参数传入&#xff0c;严格保…

【高等数学之不定积分】

一、什么是不定积分? 我们可以简单地从英文层面来基础剖析一下&#xff0c;什么是不定积分? 1.1、基本概念 小tips: 二、不定积分运算法则 三、常用积分公式 四、第一类换元积分法 4.1、定义 4.2、常用凑微分公式 4.3、小calculate 五、第二类换元积分法 5.1、定义 …

【已解决】C语言实现多线程的同步与异步

说真的写了这篇博文时&#xff0c;才知道c语言本身不支持多线程&#xff0c;而是一些windowsapi让c语言拥有多线程的能力&#xff0c;那下面内容就以打开对话框为例&#xff0c;展现如何实现多线程的同步与异步。 文章目录 问题起源c语言多线程同步方案c语言多线程异步方案总结…

JOSEF约瑟端子排中间继电器 DZY-204 DC110V 导轨安装,板前接线

DZY系列端子排中间继电器 系列型号&#xff1a; DZY-101端子排中间继电器 DZY-104端子排中间继电器 DZY-105端子排中间继电器 DZY-301端子排中间继电器 DZY-106端子排中间继电器 DZY-401端子排中间继电器 DZY-204端子排中间继电器 一、 概述 DZY-204端子排中间继电器用于各种…

【金猿CIO展】步长制药信息化管理与建设中心总经理束炼:IT部门既要懂技术,也要懂业务...

‍ 束炼 本文由步长制药信息化管理与建设中心总经理束炼撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着数字化转型的浪潮席卷各行各业&#xff0c;中国数字经济已进入快速发展阶…

杨中科 .NETCORE 异步编程

一、 为什么需要异步编程 异步点餐的优点&#xff1a;能同时服务多个客人 异步点餐一定会提升单个客户点餐速度吗&#xff1f; 答案理所当然&#xff1a;不能 图片美化服务例子服务器能够同时服务的请求数量有限 void BeautifyPic (File photo, Response response) {byte[] …

Android中集成FFmpeg及NDK基础知识

前言 在日常App开发中,难免有些功能是需要借助NDK来完成的,比如现在常见的音视频处理等,今天就以ffmpeg入手,来学习下Android NDK开发的套路. JNI和NDK 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看它们各自的定义吧. JNI和NDK 很多人并不清除JNI和NDK的概念…