pandas .drop() 内存错误大文件

Posted

技术标签:

【中文标题】pandas .drop() 内存错误大文件【英文标题】:pandas .drop() memory error large file 【发布时间】:2015-08-23 06:45:46 【问题描述】:

作为参考,这一切都在 PyCharm Educational Edition 1.0.1 的 Windows 7 x64 位机器上,带有 Python 3.4.2 和 Pandas 0.16.1

我有一个约 791MB 的 .csv 文件,其中包含约 304 万行 x 24 列。该文件包含 2014 年 1 月至 2015 年 2 月爱荷华州的酒类销售数据。如果您有兴趣,可以在此处找到该文件:https://data.iowa.gov/Economy/Iowa-Liquor-Sales/m3tr-qhgy。

其中一列名为商店位置,其中包含包含纬度和经度的地址。下面程序的目的是从存储位置单元格中取出纬度和经度,并将它们放在自己的单元格中。当文件减少到约 104 万行时,我的程序可以正常工作。

1    import pandas as pd
2
3    #import the original file
4    sales = pd.read_csv('Iowa_Liquor_Sales.csv', header=0)
5
6    #transfer the copies into lists
7    lat = sales['STORE LOCATION']
8    lon = sales['STORE LOCATION']
9
10    #separate the latitude and longitude from each cell into their own list
11    hold = [i.split('(', 1)[1] for i in lat]
12    lat2 = [i.split(',', 1)[0] for i in hold]
13    lon2 = [i.split(',', 1)[1] for i in hold]
14    lon2 = [i.split(')', 1)[0] for i in lon2]
15
16    #put the now separate latitude and longitude back into their own columns
17    sales['LATITUDE'] = lat2
18    sales['LONGITUDE'] = lon2
19
20    #drop the store location column
21    sales = sales.drop(['STORE LOCATION'], axis=1)
22
23    #export the new panda data frame into a new file
24    sales.to_csv('liquor_data2.csv')

但是,当我尝试使用完整的 304 万行文件运行代码时,它给了我这个错误:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 1595, in drop 
dropped = self.reindex(**axis_name: new_axis)
  File "C:\Python34\lib\site-packages\pandas\core\frame.py", line 2505, in reindex 
**kwargs)
  File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 1751, in reindex 
self._consolidate_inplace()
  File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 2132, in _consolidate_inplace 
self._data = self._protect_consolidate(f)
  File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 2125, in _protect_consolidate 
result = f()
  File "C:\Python34\lib\site-packages\pandas\core\generic.py", line 2131, in <lambda> 
f = lambda: self._data.consolidate()
  File "C:\Python34\lib\site-packages\pandas\core\internals.py", line 2833, in consolidate 
bm._consolidate_inplace()
  File "C:\Python34\lib\site-packages\pandas\core\internals.py", line 2838, in _consolidate_inplace 
self.blocks = tuple(_consolidate(self.blocks))
  File "C:\Python34\lib\site-packages\pandas\core\internals.py", line 3817, in _consolidate 
_can_consolidate=_can_consolidate)
  File "C:\Python34\lib\site-packages\pandas\core\internals.py", line 3840, in _merge_blocks 
new_values = _vstack([b.values for b in blocks], dtype)
  File "C:\Python34\lib\site-packages\pandas\core\internals.py", line 3870, in _vstack 
return np.vstack(to_stack)
  File "C:\Python34\lib\site-packages\numpy\core\shape_base.py", line 228, in vstack 
return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
MemoryError

我尝试在python控制台中逐行运行代码,发现程序运行sales = sales.drop(['STORE LOCATION'], axis=1)这一行后出现错误。

我在其他地方搜索过类似的问题,我想出的唯一答案是在程序读取文件时对文件进行分块,如下所示:

#import the original file
df = pd.read_csv('Iowa_Liquor_Sales7.csv', header=0, chunksize=chunksize)
sales = pd.concat(df, ignore_index=True)

我唯一的问题是我得到这个错误:

Traceback (most recent call last):
  File "C:/Users/Aaron/PycharmProjects/DATA/Liquor_Reasign_Pd.py", line 14, in <module>
    lat = sales['STORE LOCATION']
TypeError: 'TextFileReader' object is not subscriptable

我的 google-foo 已经全部吃光了。有人知道该怎么做吗?

更新 我应该指定使用分块方法,当程序尝试复制存储位置列时会出现错误。

【问题讨论】:

unclear what you're trying with this line sales = pd.concat(df, ignore_index=True) you're trying to concat a single df with nothing,单独使用df或分配@987654328没有区别@,您也不能连接单个 df,您需要传递一个可迭代的对象,例如列表 sales = pd.concat([df], ignore_index=True),这是毫无意义的,因为这是单个 df 的列表 老实说,我不确定如何使用它。那行是一个猜测实现,只是为了看看会发生什么。所以你说的是,我必须有多个列表才能使用 concat 。如果是这样,我会这样写:sales = pd.concat((df, dg, dh), ignore_index=True 不,你应该传递一个列表:sales = pd.concat([df, dg, dh], ignore_index=True 【参考方案1】:

所以我找到了我的问题的答案。我在 python 2.7 而不是 python 3.4 中运行程序。我所做的唯一更改是删除第 8 行,因为它没有被使用。我不知道 2.7 是否只是以不同的方式处理内存问题,或者我是否在 3.4 中错误地安装了 pandas 包。我将在 3.4 中重新安装 pandas 以查看是否是问题所在,但如果其他人有类似问题,请在 2.7 中尝试您的程序。

更新 意识到我在 64 位机器上运行 32 位 python。我升级了我的 python 版本,它现在运行没有内存错误。

【讨论】:

从 32 位 (Python 3.6.5) 升级到 64 位 (Python 3.7.0) 也对我有用。没有更多的内存错误。

以上是关于pandas .drop() 内存错误大文件的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 导入大小为 4GB 的 CSV 文件时出现内存错误

大数据中多列计算的内存错误

Pandas中如何处理大数据?

将 csv 文件与 pandas 连接时内存不足

使用 pypyodbc 和 pandas 加载 1GB .accdb 时出现内存错误

无法在 Python 中使用 Pandas 或 Blaze 加载大文件(~2gb)