首页 > 编程问答 >合并两个数据帧时的内存问题

合并两个数据帧时的内存问题

时间:2024-07-30 04:50:57浏览次数:13  
标签:python python-3.x

我对倒数第二句话一无所知。错误是:numpy.core._exceptions.MemoryError:无法为形状为(7791676634)和数据类型为int64的数组分配58.1 GiB

我的想法是将约1200万条记录的数据帧与另一个数据帧合并多 3-4 列应该不是什么大问题。 请帮帮我。完全被困在这里了。谢谢

Select_Emp_df 有大约 900k 条记录 Big_df 有大约 1200 万条记录和 9 列。我只需要合并两个 DF,就像我们在 Excel 中对关键列进行 vlookup 一样。

import pandas as pd

Emp_df = pd.read_csv('New_Employee_df.csv', low_memory = False )

# Append data into one data frame from three csv files of 3 years' 
transactions
df2019 = pd.read_csv('U21_02767G - Customer Trade Info2019.csv', 
low_memory = False )
df2021 = pd.read_csv('U21_02767G - Customer Trade 
Info2021(TillSep).csv', low_memory = False)
df2020 = pd.read_csv('Newdf2020.csv', low_memory = False)

Big_df = pd.concat([df2019, df2020, df2021], ignore_index=True)

Select_Emp_df = Emp_df[['CUSTKEY','GCIF_GENDER_DSC','SEX']]

Big_df = pd.merge(Big_df, Select_Emp_df, on='CUSTKEY')
print (Big_df.info)

这个错误信息 "numpy.core._exceptions.MemoryError: Unable to allocate 58.1 GiB for an array with shape (7791676634,) and data type int64" 意味着你的程序试图创建一个需要 58.1 GB 内存的数组,但是你的系统没有足够的内存来分配。

这通常发生在合并大型 DataFrame 时,尤其是在以下情况下:

  • 重复的列名 : 如果两个 DataFrame 中有多个列名相同, merge 操作可能会创建笛卡尔积,导致生成比预期大得多的 DataFrame。
  • 数据类型不匹配 : 如果连接的列数据类型不同,pandas 可能会进行隐式类型转换,占用更多内存。
  • 索引问题 : 如果 DataFrame 的索引没有正确设置,合并操作可能会生成错误的结果或消耗更多内存。

以下是一些解决此问题的建议:

1. 优化数据类型 :

  • 检查 Big_df Select_Emp_df 中每一列的数据类型,确保它们是最优的。
  • 使用 astype() 方法将数据类型转换为更小的类型,例如将 int64 转换为 int32 或者 int16 (如果数据范围允许)。
  • 对于字符串类型,如果长度有限,可以使用 object 类型代替 string 类型,可以节省内存。

2. 减少数据量 :

  • 只选择需要的列 : 在合并之前,只选择 Big_df Select_Emp_df 中真正需要的列。
  • 过滤数据 : 如果可能,在合并之前过滤掉 Big_df Select_Emp_df 中不需要的行。

3. 使用更高效的合并方法 :

  • 使用 join 方法: 如果你的 DataFrame 已经根据要连接的列进行了排序,则使用 join 方法可能比 merge 更快,更节省内存。
  • 使用 dask vaex : 对于非常大的数据集,可以考虑使用 dask vaex 等库,它们允许你在内存不足的情况下处理数据。

4. 分块处理 :

  • Big_df 分成多个较小的 DataFrame,然后逐个合并它们。

5. 检查重复列 :

  • 确保 CUSTKEY 列在两个 DataFrame 中只出现一次。

修改后的代码 :

import pandas as pd

# ... (读取数据的代码)

# 只选择需要的列
Select_Emp_df = Emp_df[['CUSTKEY','GCIF_GENDER_DSC','SEX']]
Big_df = Big_df[['CUSTKEY', '其他需要的列']]  # 替换 "其他需要的列"

# 优化数据类型 (示例)
Big_df['某些列'] = Big_df['某些列'].astype('int32') 

# 使用更高效的合并方法 (如果适用)
Big_df = Big_df.set_index('CUSTKEY')
Select_Emp_df = Select_Emp_df.set_index('CUSTKEY')
Big_df = Big_df.join(Select_Emp_df, how='left')

# ... (后续代码)

请根据你的实际数据和需求,选择合适的优化方法。

标签:python,python-3.x
From: 69821287

相关文章

  • python - 面板库 - PasswordInput 不会对回车做出反应
    我试图避免需要提交按钮。以下代码当前正在远程jupyter实验室运行。仅当光标焦点从密码小部件中移除后,才会打印该消息。我想要回车来触发消息打印。有什么线索吗?frompanel.widgetsimportPasswordInput,TextInputpn.extension()defon_enter(event=None):message_p......
  • 即使安装了软件包,也找不到 python 模块句子转换器
    对于我的python脚本(如下所示),我使用句子转换器包,其中包含SBERT模型。即使在执行“piplist”时明确列出该软件包,并且还安装了torch,所有内容都更新到最新版本,但仍然找不到该模块。脚本:importnumpyasnpimportpandasaspdfromsentence_transformersimportSenten......
  • 有没有办法在 python 中返回类实例的布尔属性?
    我想组织我玩的游戏中的汽车数据。为此,我创建了一个“Car”类。我希望将此类实例的一些属性作为布尔值,这样我就可以将此类的所有实例放入列表中并过滤它们。我当前的解决方案不起作用,因为,我收到以下错误消息:TypeError:__repr__returnednon-string(typeCar)我使用......
  • python 正则表达式匹配一行中的多个单词而不转到下一行
    我正在编写一个解析器来解析以下输出:admin@str-s6000-on-5:~$showinterfacestatusEthernet4InterfaceLanesSpeedMTUAliasVlanOperAdminTypeAsymPFC------------------------------------------......
  • 使用 Python 平滑和对称不规则形状和曲线
    我需要完成三项任务:正则化曲线曲线的对称性完成不完整的曲线例如,这里是输入和预期的输出图像:输入输出|||在一般设置中,形状可以由任何SVG曲线基元(贝塞尔曲线、直线、弧线)表示。为了统一表示,示例包含曲线的折线近似。这些折线保存为......
  • 在Python中通过绝对路径引用数据文件夹
    我有一个大型python项目,其中数据太大,无法每次都以相同的方式共享。不同的人可能会使用网络位置或将某些内容复制到本地驱动器。该路径由不同子文件夹中的脚本和笔记本使用。例如,我将创建一个config.py来定义数据文件夹的路径。importsyssys.path.append('../'......
  • python三天速成记(看完你就会)day3 满满干货~
    续上文啦~EXCEL表的操作上一篇文章讲了怎么读取和操作txt和csv文档,但其实我们生活中还有一个常用的文本格式那就是excel文件,特别是在对大量数据进行处理的时候。excel文件的用处和广泛。其实在python中有很多库可以处理excel文件,但是本文主要介绍使用最实用最广泛的库pan......
  • Python输入验证改进的其他方式
    题目[题目来源:Python编程快速上手——让繁琐工作自动化(第二版)第三章实践项目,下面的解答程序为我自己完成的,仅供参考。]编写一个名为collatz()的函数,他有一个名为number的参数。如果参数是偶数,那么collatz()就输出number//2,并返回该值。如果参数是奇数,那么collatz()就......
  • Python的PyInputPlus模块
    PyInputPlus模块简介PyInputPlus模块的功能:PyInputPlus模块是一个Python第三方模块,需要自己对它进行安装。包含与input()函数类似的、用于多种数据(如日期、数字、电子邮箱地址等)的函数。如果,用户输入了无效的内容,例如格式错误的日期或超过预期范围的数字,那么PyInputPlus模......
  • 用Python实现二进制搜索(二分查找)
    二进制搜索(binarysearch,又称二分搜索)是一种快速有效的搜索方法,用于搜索有序列表中的元素。importmathdefbinary_search(sorted_list,target):"""在有序列表sorted_list中查找目标值target的位置使用二分查找算法"""lower_bound=0#初始......