Python 2.7 如何以更优雅的方式和低内存消耗的方式改进代码?

Python 2.7 如何以更优雅的方式和低内存消耗的方式改进代码?,python-2.7,pandas,Python 2.7,Pandas,我有一个数据集,其维度大约为2000(行)x1200000(列) 我想挑选一些专栏(~8000专栏) 因此,文件维度将是2000(行)x 8000(列) 这是一个好人写的代码(我在stackoverflow搜索过,但很抱歉我忘记了他的名字) 但是,结果在我的控制台中显示了MemoryError,这意味着代码可能工作得不太好 那么,有人知道如何用更有效的方法来选择特定的列来改进代码吗 谢谢你的帮助,我想我找到了你的 因此,我的解决方案使用带参数的read\u csv: iterator=True-

我有一个数据集,其维度大约为2000(行)x1200000(列)

我想挑选一些专栏(~8000专栏)

因此,文件维度将是2000(行)x 8000(列)

这是一个好人写的代码(我在stackoverflow搜索过,但很抱歉我忘记了他的名字)

但是,结果在我的控制台中显示了MemoryError,这意味着代码可能工作得不太好

那么,有人知道如何用更有效的方法来选择特定的列来改进代码吗

谢谢你的帮助,

我想我找到了你的

因此,我的解决方案使用带参数的
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