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

  最近进行大数据处理的时候,发现我以前常用的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( ̄▽ ̄)ブ,学起来~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThingWorx/Vuforia—工业物联网和AR平台

产品概述 ThingWorx是美国PTC公司旗下的一款物联网和AR平台,它提供了适用于IoT的开发工具和能力,使开发者可以为工业物联网快速构建和部署变革性的智能互联解决方案,使创新者能够快速为当今的智能互联世界提供优异的应用程序、解决方案和用户…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0,测试和eval的时候结果也全是空的,排除了数据集读取的问题,最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之,在自定义了数据集里的metainf…

常见表单元素的使用

目录 **表单是什么**一, from🍧 Action 属性🍧 Method 属性 二,input🍧 常见的type属性🍧text属性 三,select,option下拉框🍧selected属性 四,textarea五, button 表单是什么 HTML 表单用于收集用户的输入信息。 表示文…

2,PyCharm的下载与安装

1,PyCharm的下载 a:打开PyCharm官网,并选择Developer Tools → PyCharm Pycharm官网地址 b:点击Download c:下载完成后,会在下载文件夹中,出现“pycharm-professional-2023.3.exe”文件 2&a…

C++类与对象(一)

目录 一,面向过程和面向对象初步认识 二,类的引入 三,类的定义 四,类的访问限定符及封装 五,类的实例化 六,类对象模型 七,this指针 一,面向过程和面向对象初步认识 c语言是面…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句,但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件,loop body是循环体。 当循环条件成立时,…

APP广告变现有哪些独特的优势?

作为互联网广告的载体,APP天生就比线下传统广告位更具优势,不受地域限制可以辐射到地球上的每一个角落,可以让广告获得更广的覆盖面。通过丰富的广告形式,精准的目标用户画像,也可以更好地实现品牌广告或效果广告的投放…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码: qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求(登录,查询全部,基本增删改查,分页,搜索,批量) 设计数据库搭建项目 后端…

数据结构期末考前复习

时间复杂度分析 常数时间复杂度 O(1) 的示例: def print_first_element(arr):print(arr[0])# 无论 arr 的大小如何,执行时间都是恒定的,因此具有常数时间复杂度。线性时间复杂度 O(n) 的示例: def print_all_elements(arr):for …

【并发编程篇】Callable实现多线程计算

文章目录 🍔简述Callable🌺代码测试⭐如果改为了两个线程,效果如何 🍔简述Callable Callable是Java中一个函数式接口,用于表示可以返回结果并且可能会抛出异常的计算任务。该接口定义了一个call()方法,该方…

Flink Window中典型的增量聚合(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器,我们只是知道了数据属于哪个窗口,可以将数据收集起来了;至于收集起来到底要做什么,其实还完全没有头绪,这也就是窗口函数所需要做的事情。所以在窗口分配器…

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称:Virtual Reality,缩写为VR),又称虚拟实境或灵境技术,是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术,其基本实现方式是以计算机技术为主,利用并…

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品,和开源数据库OpenGauss之间又是什么样的关系,刚开始接触的时候是一头雾水,因此本文简要对比下二者的区别,以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…

表格中上传文件的表单验证

<template><!-- 新增记录 --><div class"newRecord"><div class"danger-detail"><div class"detail-right"><el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-wid…

数据库系统原理与实践 笔记 #12

文章目录 数据库系统原理与实践 笔记 #12事务管理和并发控制与恢复(续)并发控制SQL-92中的并发级别基于锁的协议基于锁的协议的隐患锁的授予封锁协议两阶段封锁协议多粒度粒度层次的例子意向锁类型相容性矩阵多粒度封锁模式基于时间戳的协议基于时间戳协议的正确性基于有效性检…

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

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

如何轻松解决企业报修系统问题?有什么比较实用的工单管理系统?

许多企业报修方面的问题就是兼职师傅多&#xff0c;难以管理&#xff0c;导致整个报修流程都比较滞后。关于这个问题&#xff0c;我个人的建议是引入工单管理系统&#xff0c;依靠线上平台进行统一的管理。 引入工单管理系统的好处主要有&#xff1a;   1、沟通报修更加高效 …

频率、概率

频率 在相同的条件下进行试验&#xff0c;假设试验进行了次&#xff0c;其中随机事件A发生了次&#xff0c;那么就称为随机事件A发生的频率。 概率 假设随机试验E的样本空间是S&#xff0c;对于其中每个随机事件&#xff0c;都对应了一个实数&#xff0c;把这个实数称为随机…

Qt/C++音视频开发59-使用mdk-sdk组件/原qtav作者力作/性能凶残/超级跨平台

一、前言 最近一个月一直在研究mdk-sdk音视频组件&#xff0c;这个组件是原qtav作者的最新力作&#xff0c;提供了各种各样的示例demo&#xff0c;不仅限于支持C&#xff0c;其他各种比如java/flutter/web/android等全部支持&#xff0c;性能上也是杠杠的&#xff0c;目前大概…

力扣每日一题day34[110. 平衡二叉树]

给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;t…