python大规模数据处理:pandas DataFrame代替字典dict实现快速查询,避免循环和长耗时

python大规模数据处理:pandas DataFrame代替字典dict实现快速查询,避免循环和长耗时

结论

先上结论:对于规模比较大的数据,不要创建以tuple等为键的字典,可以创建pandas DataFrame,利用DataFrame的多层Index来实现查询。这样做的原因有二:

  • 创建大规模的字典时,尤其键是tuple这类数据是,非常慢。但是创建同规模的DataFrame时,效率很高
  • 字典一次只可以查询一个键,避免不了循环。DataFrame可以返回一组键对应的值,避免循环,耗时大大减少

下面具体阐述一下我是在解决什么问题时运用了这个技巧以及怎么使用。

问题

先简化一下我要处理的问题。目前有四百万的有向点对,它们之间是不重复的。点对中第一个点和第二个点的id分别放在edge_index0edge_index1array中。每个点对都有一个值,放在edge_attrarray中。所以这三个array的长度是相同的,都是四百万。
现在给你三百万的有向点对,只知道这三百万点对在四百万点对中,如何获取这三百万点对的值?
第一反应是用点对作为键创建如下一个字典

{(edge_index0[i], edge_index1[i]):attr for i, attr in enumerate(edge_attr)}

数据量小的时候,确实是没有问题的。但是面对百万级数据,我这么创建了,就2000 years later。。。

解决方案

后来就创建了一个DataFrame,并将点对设为Index。非常快,顿时觉得之前建字典的我太傻了。另外在获取三百万点对值的时候,也千万不要忘记DataFrame是可以查询一个数组的,可别傻乎乎写一个循环。下面我用小数据说明一下。
先创建一下数据

import numpy as np
import pandas as pd

edge_index0 = np.arange(10)
edge_index1 = np.arange(10,0,-1)
edge_attr = np.random.randn(10)
edge_index0, edge_index1, edge_attr
>>> (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([10,  9,  8,  7,  6,  5,  4,  3,  2,  1]),
 array([ 0.3190391 , -0.24937038,  1.46210794, -2.06014071, -0.3224172 ,
        -0.38405435,  1.13376944, -1.09989127, -0.17242821, -0.87785842]))

接下来建DataFrame并将edge_index0edge_index1设为index

df = pd.DataFrame({'edge_index0':edge_index0, 'edge_index1':edge_index1, 'edge_attr':edge_attr}).set_index(['edge_index0', 'edge_index1'])

在这里插入图片描述
在给定需要查询的点对

edge_index0 = np.arange(5)
edge_index1 = np.arange(10, 5, -1)

查询

df.loc[list(zip(edge_index0, edge_index1))]

在这里插入图片描述
Done!

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现代办公环境中,数据整理和处理是日常工作中不可或缺的一部分。随着数据量的不断增,手动处理变得既费时又容易出错。Python作为一种功能强大的编程语言,提供了自动化处理数据的能力,极大地提高了工作效率。下面将介绍一个Python自动化办公的源码,它能够批量找出包含特定内容的数据,并将这些数据整理成一个新的Excel表格。该源码的核心功能是通过Pythonpandas库来实现的。Pandas是一个强大的数据分析工具,它能够轻松读取各种格式的数据集,如CSV、Excel等,并提供了一系列数据处理的功能。用户只需提供原始数据的路径、需要查找的关键词以及输出文件的名称,该脚本就能够自动完成以下操作:读取原始数据:通过pandas的read_excel或read_csv函数,读取用户提供的原始数据文件。数据筛选:根据用户提供的关键词,使用pandas的条件筛选功能,找出包含特定内容的数据行。数据整理:对筛选出的数据进行整理,如删除不必要的列、格式化日期等,以便生成清晰可读的报告。生成新表格:将整理后的数据导出为新的Excel文件,用户可以自定义文件名和保存路径。压缩打包:为了方便传输和存档,脚本还将提供一个选项,将生成的Excel文件打包成.zip格式的压缩文件。这个Python自动化办公源码非常适合那些需要处理大量数据快速生成报告的办公场景。例如,财务人员可以使用它来筛选出特定时间段内的财务记录,市场分析师可以用它来提取特定产品的销售数据。通过这种方式,原本耗时数小时甚至数天的工作,现在只需几分钟即可完成,大大提升了工作效率和准确性。总之,这个Python自动化办公源码是一个强大而实用的工具,它能够帮助用户从繁琐的数据筛选和整理工作中解放出来,专注于更加有价值的分析和决策工作。无论是对于数据科学新手还是经验丰富的专业人士,这个源码都是一个值得尝试的解决方案。重新回答||
好的,我可以为你介绍一下Pandas库中DataFrame对象的使用。 DataFramePandas库中最重要的数据结构之一,它可以看做是一个二维的表格,类似于Excel中的一个sheet页。DataFrame中每一列可以是不同的数据类型(比如数字、字符串、日期等),并且每一行都有一个唯一的索引值。 下面是一些常用的DataFrame操作和方法: 1. 创建DataFrame对象: 可以通过传入一个字典或者一个二维数组来创建DataFrame对象,例如: ```python import pandas as pd # 通过字典创建DataFrame对象 data = {'name': ['Alice', 'Bob', 'Charlie', 'David'], 'age': [25, 30, 35, 40], 'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']} df = pd.DataFrame(data) # 通过二维数组创建DataFrame对象 data = [['Alice', 25, 'Beijing'], ['Bob', 30, 'Shanghai'], ['Charlie', 35, 'Guangzhou'], ['David', 40, 'Shenzhen']] df = pd.DataFrame(data, columns=['name', 'age', 'city']) ``` 2. 查看DataFrame对象: 可以使用head()和tail()方法来查看DataFrame对象的前几行和后几行,使用info()方法来查看DataFrame对象的基本信息,例如: ```python # 查看前几行 print(df.head()) # 查看后几行 print(df.tail()) # 查看基本信息 print(df.info()) ``` 3. 筛选数据: 可以使用loc和iloc方法来筛选DataFrame对象中的数据,例如: ```python # 通过行索引和列索引来筛选数据 print(df.loc[0, 'name']) # 通过行号和列号来筛选数据 print(df.iloc[0, 0]) # 通过布尔表达式来筛选数据 print(df[df['age'] > 30]) ``` 4. 修改数据: 可以使用loc和iloc方法来修改DataFrame对象中的数据,例如: ```python # 修改某个单元格的值 df.loc[0, 'age'] = 26 # 修改某一列的值 df['city'] = 'Beijing' # 添加一列数据 df['gender'] = ['F', 'M', 'M', 'M'] ``` 5. 删除数据: 可以使用drop方法来删除DataFrame对象中的数据,例如: ```python # 删除某一行 df = df.drop(2) # 删除某一列 df = df.drop('gender', axis=1) ``` 以上就是一些常用的DataFrame操作和方法,希望可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值