Python:将大型CSV文件转化为DataFrame

    之前因为比赛一直在玩DataFrame,处理一些小型数据感觉很是方便。但是今天遇到了一个3.32G大的CSV文件感觉甚是无力,总是报内存错误。上网查找了一些方法感觉都很有启发啊,所以自己整合了一下。并记录下来,以防记性不好的我忘记。

方法一:

with open('C:/Users/asus/Desktop/Python/test.csv') as f:
    for line in f:
        print line

这种方法虽然写起来甚是简便,代码量很少,但是读出来的都是字符串,不易清洗整理和计算,且耗时特别长,足有202s。但是可以一运行就出来东西,可以暂停来观察内容的格式什么的。


方法二:

def read_in_block(file_path):
    BLOCK_SIZE = 1024
    with open(file_path,'r') as f:
        while True:
            block = f.read(BLOCK_SIZE)  
            if block:
                yield block
            else:
                return # 若读到文件末尾,则退出

for block in read_in_block('C:/Users/asus/Desktop/Python/test.csv'):
    print block

方法二,写了一个方法将路径传了进去,然后将文件分成几段进行读取,每次读取固定的长度到内存缓冲区,然后便释放内存。耗时108s,比起第一种方法着实短了一半时间。但是相对于我这种刚入门的小白来说,面对如此庞大的字符串数据仍是不好处理。我想要的是将它转为DataFrame再进行处理。


方法三:

 
 

扫描二维码关注公众号,回复: 1697393 查看本文章

import pandas as pd
data = pd.read_csv('C:/Users/asus/Desktop/Python/test.csv',chunksize=1000000,header=None,sep=';')
for chunk in data:
    print chunk


 
 
 
 
玩方法三的时候着实让我激动了一下,耗时57s!而且还转换成了一个让我感觉它就是DataFrame类型的数据。chunksize是pandas读取csv文件的方法其中一个小小的参数,一般使用read_csv()的时候,它都是为None的。但其实,当chunksize被设置为数值是,read_csv()就会迭代读取数据,而不是一次性读取。如此就会返回一个TextFileReader的迭代器,注意,是TextFileReader哦!!属性是<class 'pandas.io.parsers.TextFileReader'>,而不是<class 'pandas.core.frame.DataFrame'>。是要用for循环才能取出数据的!否则就只能输出<pandas.io.parsers.TextFileReader object at 0x03550530>。可怜我这小白,怪不得在我清洗数据的时候它总是报错。然后我就想它for循环里面的chunk是正宗的可以清洗的DataFrame啊,我就想着可以把这些chunk连接成一个新的DataFrame。于是:
data = pd.read_csv('C:/Users/asus/Desktop/Python/test.csv',chunksize=1000000,header=None,sep=';')
# print data
df = pd.DataFrame(columns=[0,1,2,3,4,5,6,7,8])    # 初始化一个空的DataFrame
for chunk in data:
    # print type(chunk)
    # print chunk
    df = pd.concat([df,chunk],ignore_index=True)    # 将chunk都连接起来形成一个DataFrame
print df

但是,它竟然又报我的内存错误!然后我想在连接之前先把一些数据清洗掉,于是我在for循环中又加了两行代码:
for chunk in data:
    # print type(chunk)
    # print chunk
    chunk = chunk.dropna(axis=1)    # 去空
    chunk = chunk.drop_duplicates() # 删除重复数据
    df = pd.concat([df,chunk],ignore_index=True)
print df

对于我的文件,废掉的数据有很多,所以我整理后数据缩减了很多,我觉得就是因为这样我的程序才不会再报内存错误。由于这数据是指定的chunksize=1000000,即每100万条数据读取一次,分成了很多段,所以在整合一个新的DataFrame后,还需要再进行一些数据清洗整合去重什么的。程序耗时68s。


方法四:

reader = pd.read_csv('C:/Users/asus/Desktop/Python/test.csv',iterator=True,sep=';')
loop = True
chunksize = 100000
chunks = []
while loop:
    try:
        chunk = reader.get_chunk(chunksize)
        chunk = chunk.dropna(axis=1)
        chunk = chunk.drop_duplicates()
        chunks.append(chunk)
    except StopIteration:
        loop = False
        print "Iteration is stopped."
df = pd.concat(chunks,ignore_index=True)
df = df.dropna(axis=1)
df = df.drop_duplicates()
print df

根据方法三的启发,我又参考了这位大神的代码,又寻到了一种方法。也是分成了几段,先清洗再整合串到一个DataFrame中,耗时50s。


 
 

觉得这些大神的代码写的真好,比我的好太多太多,真真是羡慕。自己需要加油去努力达到自己希望的高度吧。
第一次写博客,有些布局上面的失误各位就不要深究了。在下一初玩Python的小白,有很多地方不懂,若有错误请多指点,但不要喷啊各位,我们要营造一个和谐友爱的网络环境啊
参考链接:
https://www.jianshu.com/p/f935673ef524
http://www.jb51.net/article/63603.htm

猜你喜欢

转载自blog.csdn.net/anasta198110/article/details/79590157