这两天掌柜遇到要读取大型(基本都超过1G)的CSV文件到单个DataFrame里面的操作,搜了一下,这里结合自身实际情况做个总结,希望对有同样需求的朋友有帮助!下面直接看案例吧👇
在这里插入图片描述
除了一个小于1G的CSV文件,其余都大于1.3G。。。好了,现在掌柜要读取其中一个大型CSV文件到单个DataFrame中,那应该怎么操作呢?

  • 第一种:使用chunksize模块。
  • 优点 :步骤简单,且对内存相当足(>=16G)的电脑适用。
  • 缺点 :如果你的电脑/云/服务器内存不足以支撑这些大型文件( 比如你的内存只有2G,但是文件 >= 4G的情况下 ), 同样会出现Memory error(内存泄漏)
  • 具体方法:
import pandas as pd
import numpy as np
df_chunk = pd.read_csv('YourFileName.csv', chunksize=1000000, iterator = True) #使用chunksize分块读取大型csv文件,这里每次读取chunksize为100万
chunk_list = [] 
for chunk in df_chunk:
    chunk_list.append(chunk)
df_concat = pd.concat(chunk_list) #再把这些块组合成一个DataFrame
df_concat.shape

整合后的DataFrame大小如下:
在这里插入图片描述
(其实这还是掌柜选取最小一个文件读出来的数据。。。可见其他文件都是大于1000万行的😂)

  • 第二种:对读取的每列数据进行类型转换,减少内存占用。(推荐使用)

  • 优点:极大的压缩了文件内存,即便是内存不大的电脑/服务器也可以使用。

  • 缺点:初次使用的步骤相对复杂,需先提取部分数据来找出合适的转换类型。(这里如何找到每列特征对应的数据转换类型, 建议参考这个博客👉:Tutorial: Using Pandas with Large Data Sets in Python写的很详细,掌柜就不再写了。
    这里附上常见的数据类型在pandas里面
    在这里插入图片描述

  • 具体方法:

import pandas as pd
import numpy as np
MAX_ROWS = XXX 
df = pd.read_csv('YourFileName.csv', nrows = MAX_ROWS)
df.info()
...... #比如这里可以先设置读取行数为10万条数据,然后进行分析,找到需要转换的数据类型后再全部数据查看;防止内存泄漏
df = pd.read_csv('YourFileName.csv', dtype = {
                              #这里就是你要转换的数据列名字和对应类型,下面随意举例
                                   'column_1': np.uint16,
                                   'column_2': np.float32,
                                   'column_3': np.float32,
                                   'column_4': np.float32,
                                   'column_5': np.uint8,
df.info()
  • 第三种:只读取可能有用的部分特征列到DataFrame中。
  • 优点:省内存,步骤简单。
  • 缺点:需要先对整个数据集提取小部分行数进行一个整体的分析,最后才能知道哪些特征是有用的。
  • 具体方法:
import pandas as pd
df = pd.read_csv('YourFileName.csv', nrows = 100000)
df.info()
......  
#此处省略各种分析方法,最后得到如下有用特征和无用特征
use_cols = ['column_1', 'column_2', 'column_3', 'column_4', 'column_5']
unused_cols = ['column_6', 'column_7']
df = pd.read_csv('YourFileName.csv', usecols=use_cols)
df.info()
  • 第四种:使用并行计算库Dask。(推荐使用)
  • 优点:能在集群中进行分布式计算,方便快捷高效。
  • 缺点:对新手来说,虽然需要花点时间去熟悉Dask的使用方法,建议参考官方文档,但不是很难。
  • 具体方法:
import dask.dataframe as dd
df = dd.read_csv('YourFileName.csv')
df.head()

下面是掌柜使用Dask读取了1.3G的CSV文件后的一个运行时间:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出来Dask的计算效率是很不错的,只用了17.1ms就读取了1.3G+的CSV文件;而且掌柜这还是在内存只有2G的云服务器上面操作的,并没有发生(由Memory Error造成的)Kernel died的情况。

好了,主要的四种方法掌柜已经在这里分享了,大家按自己的需求来选取使用😁。如果你有更好的方法,欢迎在下面评论,谢谢。

参考资料:
3 simple ways to handle large data with Pandas
Tutorial: Using Pandas with Large Data Sets in Python
Dask官方文档

这两天掌柜遇到要一次读取多个大型(都基本超过1G)的CSV文件到单个DataFrame里面的操作,这里做个总结,希望对有同样需求的朋友有帮助!下面直接看案例吧????除了一个小于1G的csv文件,其余都大于1.3G????。。。好了,现在掌柜要一次读取这10个大型csv文件到DataFrame中。第一种:使用chunksize模块。... print(chunk.tail(10)) 以上这篇python读取几个G的csv文件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:pythoncsv文件时指定行为表头或无表头的方法Python把对应格 首先使用office打不开 然后在python中使用基本的pandas.read_csv打开文件时:MemoryError 最后查阅read_csv文档发现可以分块读取。 read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,IO
CSV文件打开以及乱码问题 今天要使用一个csv文件,但是有8个G,excel打不开,用Python的pandas也读不了,可能是我电脑配置太落后,也可能是数据实在太大了。 解决办法:首先处理打不开的问题,我们可以把大的csv分割成若干小文件,使用文件分割器,按10000行一个文件分割,分割器在F:\新建文件夹\csv文件分割器\split.exe,稍等一段时间就行。我还试过另一个分割器,但是不行...
python 读取文件夹下所有 csv xls xlsx文件 并简单清洗数据 保存到 dataframe 中 没有的话直接pip下载就行 pip install pandas pip install os data_train 即为所有文件数据
postgresql数据库读取大容量sql文件 1.问题描述 postgre数据库有一个管理网页,点击大象图形图标(pgAdmin 4)即可打开。在网页端可以打开一定大小的sql文件。当文件很大时,打不开时,我们则可以通过控制台的方式读取文件。 1.1 网页读取sql文件方法 1.选择对应的模式 2.右键选择Query Tool查询工具 3.点击文件图案的图标,可打开文件选择器,选择你需要执行的sql文件即可 2.前提工作 通过控制台进入到你所指定的数据库下: 1.搜索psql,找到SQL Shell
如果一个csv文件过大,比如说达到好几G,直接读取的话内存估计hold不住,幸好pandas支持使用chunksize指定行数,每次按多少行多少行来读取,这样就避免了一次性读取过多数据导致内存崩溃。 用row["某个列的名称"] 即可读取该列的对应数据了,之后就可以进行数据处理了。 import pandas as pd chunksize = 1000 count = 1 for df in pd.read_csv('1.txt',chunksize=chunksize): print(cou
<h3>回答1:</h3><br/>在Python Pandas中,我们可以用“pd.read_csv()”方法读取CSV文件,并将其转换DataFrame格式。要批量读取CSV文件,我们可以使用Python的os库和glob库。 首先,我们需要导入需要使用的库: import pandas as pd import os import glob 接下来,设置CSV文件路径和通配符: path = 'C:/Users/User/CSVFiles/*.csv' 这里的“*”代表所有符合条件的CSV文件,路径可以根据需要进行修改。 然后,我们可以使用glob库的“glob()”方法来查找所有符合条件的CSV文件: all_files = glob.glob(path) 通过循环,我们可以逐个读取CSV文件,并将它们按顺序合并为一个DataFrame: li = [] for filename in all_files: df = pd.read_csv(filename, index_col=None, header=0) li.append(df) frame = pd.concat(li, axis=0, ignore_index=True) 在这个循环中,我们首先用“pd.read_csv()”方法读取CSV文件,并将它们存储到一个列表中。最后,使用“pd.concat()”方法将所有DataFrame合并为一个。 通过这种方法,我们可以方便地批量读取CSV文件,并将它们转换为Pandas DataFrame。 <h3>回答2:</h3><br/>Python是一种很流行的编程语言,而Pandas是Python中的一种常用数据处理库。Pandas中的DataFrame一个非常重要的数据结构,使用它可以轻松地处理和分析数据。 很多时候,我们需要批量读取多个CSV文件DataFrame中进行处理。这时候,可以使用Pandas中的read_csv函数。下面,我们来介绍如何使用Pandas批量读取CSV文件DataFrame中。 第一步是导入需要使用的Python库,即Pandas库: import pandas as pd import os 然后,我们需要定义一个函数来批量读取CSV文件。这个函数接受两个参数:文件夹路径和文件名前缀。在这个函数中,我们首先使用os库中的listdir函数获取文件夹中所有符合条件的文件名(即以指定前缀开头的文件),然后逐个读取这些CSV文件并将它们存储为一个DataFrame。最后,将这些DataFrame合并为一个大的DataFrame并返回它。 def read_csv_files(folder_path, file_prefix): files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.startswith(file_prefix)] df_list = [] for file in files: df = pd.read_csv(file) df_list.append(df) df_all = pd.concat(df_list, ignore_index=True) return df_all 使用这个函数读取多个CSV文件非常方便。只需要使用下面的代码即可: df = read_csv_files('/path/to/csv/folder', 'prefix_') 这里,/path/to/csv/folder是存储CSV文件文件夹路径,prefix_是CSV文件名的前缀。使用这个函数,可以读取所有以prefix_开头的CSV文件,并将它们合并为一个大的DataFrame。 通过上述方法,可轻松批量读取CSV文件DataFrame中,这样可以方便地进行后续的数据处理和分析。 <h3>回答3:</h3><br/>Python pandas是一款非常流行的数据分析库,可以非常方便地读取和处理各种数据格式,其中包含了一些非常实用的方法,例如批量读取CSV文件Dataframe方法。下面将详细介绍这种方法。 pandas主要提供了两个方法,用于批量读取CSV文件Dataframe: pd.concat() 和pd.read_csv()。其中pd.concat()方法可以将多个Dataframe连接起来,然后再次赋值给同一个Dataframe,实现批量读取CSV文件。 首先,我们需要引入pandas库并设置工作目录: ```python import pandas as pd import os os.chdir("your_folder_path") 接下来,我们需要获取所有CSV文件文件名列表: ```python all_files = os.listdir("your_folder_path") csv_files = [f for f in all_files if f.endswith('.csv')] 然后我们需要将所有CSV文件读取Dataframe中,并将它们连接起来: ```python df_from_each_file = (pd.read_csv(f) for f in csv_files) df = pd.concat(df_from_each_file, axis=0, ignore_index=True) 这将使用一个for循环从文件列表中逐个迭代读取所有CSV文件的内容,使用pd.read_csv()指令以Dataframe的形式读取每个文件的内容。最后,我们使用pd.concat()将所有读取到的Dataframe连接起来,使用ignore_index=True指令可以避免出现来自多个CSV文件的相同行索引。 最后,我们可以对合并后的Dataframe进行数据清理、转换和整理,实现我们需要的功能。 综上所述,以下是批量读取CSV文件Dataframe方法的完整代码示例: ```python import pandas as pd import os os.chdir("your_folder_path") all_files = os.listdir("your_folder_path") csv_files = [f for f in all_files if f.endswith('.csv')] df_from_each_file = (pd.read_csv(f) for f in csv_files) df = pd.concat(df_from_each_file, axis=0, ignore_index=True) # 数据清理、转换和整理 # ... # 输出处理的Dataframe print(df.head()) 在实际操作过程中,我们需要根据需要调用合适的库和函数,对CSV文件进行必要的处理。在这个过程中,Pandas的强大功能确实帮助我们大大简化了处理大量CSV文件的过程。
如何解决报错ValueError: Input contains NaN, infinity or a value too large for dtype('float64')的问题 59259 Jupyter notebook读取大型csv文件遇到The kernel appears to have died. It will restart automatically的错误原因排查 m0_59152341: 你好 请问你解决了吗,我现在也是在读一个10g的dat文件,直接整个网页崩溃了