Python 2.7 如何以更优雅的方式和低内存消耗的方式改进代码?
我有一个数据集,其维度大约为2000(行)x1200000(列) 我想挑选一些专栏(~8000专栏) 因此,文件维度将是2000(行)x 8000(列) 这是一个好人写的代码(我在stackoverflow搜索过,但很抱歉我忘记了他的名字) 但是,结果在我的控制台中显示了MemoryError,这意味着代码可能工作得不太好 那么,有人知道如何用更有效的方法来选择特定的列来改进代码吗 谢谢你的帮助,我想我找到了你的 因此,我的解决方案使用带参数的Python 2.7 如何以更优雅的方式和低内存消耗的方式改进代码?,python-2.7,pandas,Python 2.7,Pandas,我有一个数据集,其维度大约为2000(行)x1200000(列) 我想挑选一些专栏(~8000专栏) 因此,文件维度将是2000(行)x 8000(列) 这是一个好人写的代码(我在stackoverflow搜索过,但很抱歉我忘记了他的名字) 但是,结果在我的控制台中显示了MemoryError,这意味着代码可能工作得不太好 那么,有人知道如何用更有效的方法来选择特定的列来改进代码吗 谢谢你的帮助,我想我找到了你的 因此,我的解决方案使用带参数的read\u csv: iterator=True-
read\u csv
:
iterator=True
-如果为True,则返回一个TextFileReader
,以允许逐段将文件读入内存chunksize=1000
-用于将文件“分块”成块的行数。将导致返回TextFileReader
对象usecols=subset
-返回的列的子集,导致更快的解析时间和更低的内存使用率usecols
过滤大型数据集-我只使用数据集(2000,8000)而不是(2000,120 000)
我使用此代码段进行测试:
import pandas as pd
import io
temp=u"""A,B,C,D,E,F,G
1,2,3,4,5,6,7"""
temp1=u"""Name
B
B
C
B
C
C
E
F"""
subset = pd.read_csv(io.StringIO(temp1), index_col=[0]).index.unique()
print subset
#use subset as filter of columns
df = pd.read_csv(io.StringIO(temp), usecols=subset)
print df.head()
print df.shape
为什么不直接使用df[list['Query.Name'].unique()][code>to_csv('output.csv')Name\u list行对我来说似乎是多余的,同时对变量名使用
list
也不是一个好主意,因为这会对list
python类型产生阴影。哪一行是内存错误?(在回溯中->指向哪里?)?这对处理内存错误有很大帮助。了解这是哪种数据也很有用。字符串、浮点数、混合内容?@maxymoo谢谢,第二行,df=pd.read_csv…,我用了32位。@chris sc混合内容非常感谢,我已经测试过了。控制台显示,我必须向命令中添加low_memory=False
,这样代码在linux环境中可以非常高效地工作(但在我的笔记本电脑中工作不好,我想这是我的规范问题,无论如何,非常感谢)!
import pandas as pd
#read subset from csv and remove duplicate indices
subset = pd.read_csv('8kx1.csv', index_col=[0]).index.unique()
print subset
#use subset as filter of columns
tp = pd.read_csv('input.csv',iterator=True, chunksize=1000, usecols=subset)
df = pd.concat(tp, ignore_index=True)
print df.head()
print df.shape
#write to csv
df.to_csv('output.csv',iterator=True, chunksize=1000)
import pandas as pd
import io
temp=u"""A,B,C,D,E,F,G
1,2,3,4,5,6,7"""
temp1=u"""Name
B
B
C
B
C
C
E
F"""
subset = pd.read_csv(io.StringIO(temp1), index_col=[0]).index.unique()
print subset
#use subset as filter of columns
df = pd.read_csv(io.StringIO(temp), usecols=subset)
print df.head()
print df.shape