【神行百里】pandas查询加速之行索引篇

news2024/9/20 19:39:30

  最近进行大数据处理的时候,发现我以前常用的pandas查询方法太慢了,太慢了,真是太慢了,查阅资料,遂发现了一种新的加速方法,能助力我飞上天,和太阳肩并肩,所以记录下来。


1. 场景说明与数据集构建

  首先,阐述一下我们DataFrame查询应用场景,有两个csv表格文件;

  表1中有两列,一列为id号(index),一列为名字(name);
  表2中有两列,一列为id号(index),一列为名字对应的内容(content);
  此外,表1和表2中的顺序是混乱的,每一行的index都不相同。

  此时,你有一个想法,把name和content对应起来,在一张表中,有名字(name)就知道内容(content)了,我们先用下列代码构建这样一个数据集:

import pandas as pd
from pandas.core.frame import DataFrame
import random
from tqdm import tqdm

name = ["一念关山", "奉上", "立剑"]

content = ["一念月落,一念身错,一念关山难涉过。棋逢过客,执子者不问因果。", 
           "奉上,唯愿去踏破善恶之叠浪,一心并肩赴跌宕。", 
           "刺予我伤口,重生了魂魄,立剑的时候,疾骤的嘶吼。"]

result1 = []
result2 = []
for i in tqdm(range(10000000)):
    
    temp = random.randint(0, 2)
    xx1 = name[temp] + "__" + str(i)
    xx2 = "YNGS" + "__" + str(i)
    xx3 = content[temp] + "__" + str(i)
    
    result1.append([xx2, xx1])
    result2.append([xx2, xx3])
    
Frame1 = DataFrame(result1, columns=["index", "name"])
Frame1.to_csv("./test01.csv", index=False)

Frame2 = DataFrame(result2, columns=["index", "content"])
shuffled_df = Frame2.sample(frac=1, random_state=42)   # 打乱数据
shuffled_df.to_csv("./test02.csv", index=False)

  代码构建了一个1000万行的数据表,当然了表中数据没有实际意义,仅供测试使用。

来瞅瞅我们生成的数据表格吧~
test01.csv:
在这里插入图片描述

test02.csv:
在这里插入图片描述


2. loc加速查询测试

2.1 原始方法

  有了生成好的数据表,怎么做其实很简单,常规的做法如下虚线中的代码所示,对每一行循环,查询content表中与name表中index相同的行,再取content内容就可以了。

import pandas as pd
from pandas.core.frame import DataFrame
from tqdm import tqdm

data_name = pd.read_csv("./test01.csv", encoding="utf-8")
data_content = pd.read_csv("./test02.csv", encoding="utf-8")

name = data_name["name"].values.tolist()
index = data_name["index"].values.tolist()

result = []
for i in tqdm(range(len(index))):
    
    temp_index = index[i]
    
    # -----------------------------------------------------------------------
    temp_data = data_content[data_content["index"] == temp_index]
    temp_content = temp_data["content"].values.tolist()[0]
    # -----------------------------------------------------------------------
    
    result.append([temp_index, temp_content])
    
Frame = DataFrame(result, columns=["name", "content"])
Frame.to_csv("./finish.csv", index=False)

  我们来看看运行速度,tqdm显示为725小时,完成这1000万行的数据需要那么久啊!这还能忍,人生苦短,python在手,我要加速 /(ㄒoㄒ)/~~

在这里插入图片描述

2.2 加速方法

  其实 test01.csv 和 test02.csv 有相同的一列,即索引列(index),一般的dataframe的行索引默认为1、2、3…,我们可以设置index列为行索引,采用loc方法查询给定索引名对应的内容,修改代码如下虚线中所示:

import pandas as pd
from pandas.core.frame import DataFrame
from tqdm import tqdm

data_name = pd.read_csv("./test01.csv", encoding="utf-8")
data_content = pd.read_csv("./test02.csv", encoding="utf-8")

# -----------------------------------------------------------------------
data_content = data_content.set_index("index")  # 行索引设置
# -----------------------------------------------------------------------

name = data_name["name"].values.tolist()
index = data_name["index"].values.tolist()

result = []
for i in tqdm(range(len(index))):
    
    temp_index = index[i]
    
    # ---------------------------------------------------------
    temp_data = data_content.loc[temp_index]
    temp_content = [temp_data["content"]]
    # ---------------------------------------------------------

    result.append([temp_index, temp_content])
    
Frame = DataFrame(result, columns=["name", "content"])
Frame.to_csv("./finish.csv", index=False)

  设置“index”列为行索引的dataframe长下面这样了,其大小为(10000000, 1)

在这里插入图片描述

  测试一下运行速度,快看家人们,凌波微步再现,飞一般的感觉啊,9秒就完成了4%了,一共只需要几分钟时间即可完成1000万数据处理~

在这里插入图片描述

   由此可见,行索引查询能提速两百多倍,在处理千万级数据时,可以采用该方法神行百里,加速执行嗷o( ̄▽ ̄)ブ,学起来~

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

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

相关文章

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月,Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾,在 NEARCON2023 的多链网络主题沙龙中发言:我们依然处于区…

Emacs之Plantuml用于复杂UML类图(Markdown用于简单类图)(一百三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

FTP、U盘等传统数据安全摆渡方法的6个弊端

数据安全摆渡,即数据在不同的网络之间,进行安全流转。做网间隔离的初衷,就是为了保护数据安全,但是在数据摆渡时,除了安全,企业还是需要考虑其他的要素,比如可靠性、易用性、兼容性等等。而传统…

解决:TypeError: write() argument must be str, not Tag

解决:TypeError: write() argument must be str, not Tag 文章目录 解决:TypeError: write() argument must be str, not Tag背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错&#xf…

Qt搭建MQTT编程环境

QT 部署官方MQTT模块 在Qt Creator中,默认是没有部署Mqtt模块的,在使用QT编程之前,先把mqtt 模块部署到开发环境当中。参考博文:Qt开发技术:mqtt介绍、QtMqtt编译和开发环境搭建_长沙红胖子-CSDN博客 下载 Qt官方在g…

HTML 块级元素与行内元素有哪些以及注意、总结

行内元素和块级元素是HTML中的两种元素类型,它们在页面中的显示方式和行为有所不同。 块级元素(Block-level Elements): 常见的块级元素有div、p、h1-h6、ul、ol、li、table、form等。 块级元素会独占一行,即使没有…

WPF仿网易云搭建笔记(4):信息流控制之消息订阅

文章目录 专栏和Gitee仓库前言消息订阅最简单的案例简单用例父组件订阅子组件回调 结果 消息订阅机制消息token是A还是B?传递消息的载体。双重token重复订阅问题 结论 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 上一篇文章中,我们简单…

最大公因数,最小公倍数详解

前言 对于初学编程的小伙伴们肯定经常遇见此类问题,而且为之头疼,今天我来给大家分享一下,最大公因数和最小公倍数的求法。让我们开始吧! 文章目录 1,最大公因数法1法2法3 2,最小公倍数3,尾声 …

修改 vCenter Server 的 FQDN | hostname | PNID

目录 1 先决条件2. 修改 VC 7.0.3 hostname(1)备份 VCSA(2)为VCSA的新hostname创建DNS记录(3)修改 VCSA 的hostname① 进入vCenter Server VAMI② 查看当前 FQDN③ 编辑网络设置④ 选择网络适配器⑤ 修改 h…

【Linux】 线程池

线程池 什么是线程池? 一次预先申请一批线程,让这批线程有任务,就处理任务;没任务,就处于等待状态。 为什么要有线程池? 以空间换时间,预先申请一批线程,当有任务到来,可…

arkts编译报错-arkts-limited-stdlib错误【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

基于深度学习的yolov5入侵检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介IntroductionYOLOv5 Overview入侵检测系统架构1. 数据采集2. YOLOv5模型训练3. 实时监测4. 告警与反馈 性能评估与优化 二、功能三、系统四. 总结 一项目简…

渗透测试是什么

随着信息技术的飞速发展,网络安全问题日益凸显。其中,渗透测试作为一种重要的安全评估方法,已经被越来越多的企业和组织所采用。渗透测试通过模拟黑客攻击,发现并修复潜在的安全漏洞,从而提高系统的安全性。 直白的说…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天,数据的价值不可估量,尤其是金融行业,数据不仅代表着企业的核心资产,还涉及到客户的隐私和信任。因此对于金融行业而言,保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…

功能介绍 | 红队企业版全新功能定时扫描与企业版报告强势来袭!

0x01 前言 面对大型企业复杂且庞大的网络环境,我们通常会遇到资产繁杂、边缘资产发现困难以及资产种类梳理不全等问题。Goby红队企业版的出现,旨在除了满足企业在漏洞扫描、威胁情报分析、安全评估等方面的基础需求之外,我们也在一直持续更新…

12.5单端口RAM,JS计数器,流水线乘法器,不重叠序列检测器(状态机+移位寄存器),信号发生器,交通灯

单端口RAM timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data );reg [6:0]mem[127:0];integer i;always (posedge clk or negedge rst) beginif(!rst) beginfor (i0; i<127 ; ii1) beginmem[i]…

Python3 中常见的数据类型

目录 数字(Number)总结 字符串(String)字符串运算符字符串格式化字符串的截取总结 List&#xff08;列表&#xff09;更新列表删除列表元素列表函数&方法总结 Tuple&#xff08;元组&#xff09;修改元组删除元组总结 Set&#xff08;集合&#xff09;Dictionary&#xff0…

Java实现快速排序算法

快速排序算法 &#xff08;1&#xff09;概念&#xff1a;快速排序是指通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行&…

Python中的魔力编程:掌握面向对象之道

Python中的面向对象编程 背景&#xff1a; ​ 最近在看一些代码的时候&#xff0c;对类中的一些内置方法不是很懂&#xff0c;因此出一篇文章来细说一下&#xff0c;希望大家看完后对Python中类有一个清楚的认识。 基础铺垫&#xff1a; ​ 面向对象的三个特点&#xff1a;…

案例课6——追一科技

1.公司介绍 追一科技是一家企业级智能服务AI公司&#xff0c;创立于2016年3月&#xff0c;主攻深度学习和自然语言处理&#xff0c;为金融、零售、生活服务等领域企业提供智能服务系统和解决方案。 追一科技的智能服务系统AIforce&#xff0c;拥有AI语义理解能力、智能产品矩阵…