Python学习笔记:pandas.read

您所在的位置:网站首页 pandas怎么读csv Python学习笔记:pandas.read

Python学习笔记:pandas.read

#Python学习笔记:pandas.read| 来源: 网络整理| 查看: 265

一、背景

日常数据分析工作中,难免碰到数据量特别大的情况,动不动就2、3千万行,如果直接读进 Python 内存中,且不说内存够不够,读取的时间和后续的处理操作都很费劲。

Pandas 的 read_csv 函数提供2个参数:chunksize、iterator ,可实现按行多次读取文件,避免内存不足情况。

使用语法为:

* iterator : boolean, default False 返回一个TextFileReader 对象,以便逐块处理文件。 * chunksize : int, default None 文件块的大小, See IO Tools docs for more informationon iterator and chunksize.

测试数据文件构建:

import pandas as pd import numpy as np import os os.chdir(r'C:\Users\111\Desktop') np.random.seed = 2021 df_size = 1000 # 10000000 df = pd.DataFrame({ 'a': np.random.rand(df_size), 'b': np.random.rand(df_size), 'c': np.random.rand(df_size), 'd': np.random.rand(df_size), 'e': np.random.rand(df_size) }) df.head() df.to_csv('data.csv') 二、指定 chunksize 分块读取文件

pandas.read_csv 参数 chunksize 通过指定一个分块大小(每次读取多少行)来读取大数据文件,可避免一次性读取内存不足,返回的是一个可迭代对象 TextFileReader 。

import pandas as pd reader = pd.read_csv('data.csv', sep=',', chunksize=10) # for chunk in reader: # df = chunk # 对 chunk 进行数据处理 print(type(chunk), chunk.shape) ''' (10, 6) (10, 6) (10, 6) (10, 6) (10, 6) ''' for chunk in reader: # df = chunk # 对 chunk 进行数据处理 chunk.rename(columns={'Unnamed: 0':'index2'}, inplace=True) # 修改列名 print(chunk.columns) 三、指定 iterator=True

指定 iterator=True 也可以返回一个可迭代对象 TextFileReader 。

iterator=True 和 chunksize 可以同时指定使用。

reader = pd.read_csv('data.csv', sep=',', iterator=True) data = reader.get_chunk(5) # 返回N行数据块 data ''' Unnamed: 0 a b c d e 0 0 0.289972 0.717806 0.886283 0.522148 0.976798 1 1 0.254952 0.048073 0.464765 0.138978 0.983041 2 2 0.634708 0.533182 0.855981 0.456156 0.620018 3 3 0.812648 0.024870 0.536520 0.894937 0.102704 4 4 0.699629 0.038305 0.379534 0.876242 0.906875 ''' get_chunk(size) -- 返回一个N行的数据块 每次执行获取N行数据,再次执行,获取下一个数据块 filePath = r'data_csv.csv' f = open(filePath, encoding='utf-8') reader = pd.read_csv(f, sep=',', iterator=True) data1 = reader.get_chunk(5) data2 = reader.get_chunk(6) f.close()

读取未知数据文件(超大文件,几GB)前几行,进行数据类型观察、列标签观察等。

四、其他技巧 1.获取文件行数 count = 0 file = open('data_csv.csv', 'r', encoding='utf-8') while 1: buffer = file.read(8*1024*1024) # 可大概设置 if not buffer: break count += buffer.count('\n') print(count) file.close()

再根据行数估算内存可读进多少数据,将原始数据进行划分为多少块?

2.分块拆分文件 import pandas as pd reader = pd.read_csv('data_csv.csv', sep=',', chunksize=2000000) for i, chunk in enumerate(reader): print(i, ' ', len(chunk)) chunk.to_csv('./data/data_' + str(i) + '.csv', index=False)

Python 路径加一点是当前路径,加两点是上一级路径。

3.合并数据 import pandas as pd df = [pd.read_csv('./data/data_' + str(i) + '.csv') for i in range(5)] # 列表推导式 data = pd.concat(df, axis=0).reset_index(drop=True) # 合并 data.head() data.tail()

当 axis = 0 时,pd.concat 实现列对齐合并。

4.分块读取文件 import feather import pandas as pd filePath = r'data_csv.csv' def read_csv_feature(filePath): # 读取文件 f = open(filePath, encoding='utf-8') reader = pd.read_csv(f, sep=',', iterator=True) loop = True chunkSize = 1000000 chunks = [] while loop: try: chunk = reader.get_chunk(chunkSize) chunks.append(chunk) except StopIteration: loop = False print('Iteration is END!!!') df = pd.concat(chunks, axis=0, ignore_index=True) f.close() return df data = read_csv_feature(filePath)

参考链接:pandas.read_csv——分块读取大文件

参考链接:使用Pandas分块处理大文件

参考链接:pandas使用chunksize分块处理大型csv文件

参考链接:pandas.read_csv参数详解

参考链接:Python chunk读取超大文件

参考链接:利用feather快速处理大数据



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3