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

    xiaoxiao2025-03-15  23

    原文:https://blog.csdn.net/Anasta198110/article/details/79590157

    方法一:

    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再进行处理。

    方法三:

    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。

    觉得这些大神的代码写的真好,比我的好太多太多,真真是羡慕。自己需要加油去努力达到自己希望的高度吧。

    最新回复(0)