我对倒数第二句话一无所知。错误是: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