Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >加载大型CSV文件到Pandas DataFrame的技巧和诀窍

加载大型CSV文件到Pandas DataFrame的技巧和诀窍

作者头像
磐创AI
发布于 2024-04-03 11:13:38
发布于 2024-04-03 11:13:38
56800
代码可运行
举报
运行总次数:0
代码可运行

现实世界中的大多数数据集通常都非常庞大,以千兆字节为单位,并包含数百万行。在本文中,我将讨论处理大型CSV数据集时可以采用的一些技巧。

处理大型CSV文件时,有两个主要关注点:

  1. 加载大型CSV文件时所使用的内存量。
  2. 加载大型CSV文件所花费的时间。

理想情况下,你希望最小化DataFrame的内存占用,同时减少加载所需的时间。在本文中,我将通过使用一个示例数据集来向你演示。

我们的数据集

在本文中,将使用从https://www.kaggle.com/datasets/4e614ec846ab778f6a2ff166232d5a65f5e6786b4f5781690588bd2cccd71cb6?resource=download 获取的日本贸易统计数据。

该数据集包含了从1988年到2020年的贸易数据。它包含超过1亿行,CSV文件占用了4.5 GB的空间。因此,这个数据集是用来说明本文概念的理想数据集。

将CSV文件加载到Pandas DataFrame中

首先,让我们从加载包含超过1亿行的整个CSV文件开始。我想看看加载DataFrame需要多长时间,以及它的内存占用情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
import pandas as pd

start = time.time()

df = pd.read_csv("custom_1988_2020.csv")

print(time.time() - start, ' seconds')
display(df)
display(df.info())

输出如下:

加载整个CSV文件需要大约30秒,其总内存占用令人震惊,达到了6.8 GB!(我使用的是内存为32GB的Mac Studio作为参考。)

检查列

让我们检查数据框中的列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.columns

现在,你应该意识到这个CSV文件没有标题,因此Pandas将假定CSV文件的第一行包含标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Index(['198801', '1', '103', '100', '000000190', '0', '35843', '34353'], dtype='object')
加载时使用标题

由于CSV文件没有标题,你至少可以使用header参数告诉Pandas该CSV文件没有标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# loading with no headers specified
df = pd.read_csv("custom_1988_2020.csv", header=None)
display(df)

Pandas现在将自动以0、1等开头的列名命名列。

从https://www.kaggle.com/datasets/4e614ec846ab778f6a2ff166232d5a65f5e6786b4f5781690588bd2cccd71cb6?resource=download上的数据集描述中,我们看看各列:

  • ym(年份+月份)
  • exp_imp(出口:1,进口:2)
  • hs9(HS编码)
  • 海关
  • 国家
  • Q1
  • Q2(数量)
  • Value(以千日元为单位)

让我们使用names参数为这些列命名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'])
display(df)

现在DataFrame的列名如下:“YearMonth”,“ExportImport”,“HSCode”,“Customs”,“Country”,“Q1”,“Q2_Quantity”,“Value”。

加载特定列

由于CSV文件非常庞大,你可能会问自己的下一个问题是,你真的需要所有列吗?要加载特定列,你可以使用usecols参数指定要加载的列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start = time.time()

df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 usecols = ["YearMonth", "Value"])

print(time.time() - start, ' seconds')
display(df)
display(df.info())

如上面的输出所示,内存占用减少到了1.7GB,加载时间也减少到了17秒。

usecols参数还支持列位置索引。上面的代码也可以用列号0和7来重写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 usecols = [0, 7])

print(time.time() - start, ' seconds')
display(df)

请注意,你不能使用-1来表示最后一列,像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
usecols = [0, -1])   # -1 is not supported

usecols参数还支持lambda函数。例如,如果你想检索除“Country”列之外的所有列,你可以使用以下lambda表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 usecols = lambda column: column not in ['Country'])
display(df)

现在,“Country”列将被排除在结果之外。

在usecols参数中使用lambda函数可以让你做一些有趣的事情,比如加载列名包含“Q”的列,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
usecols = lambda column: "Q" in column

或者加载列名长度超过七个字符的列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
usecols = lambda column: len(column) > 7
加载前n行

在许多情况下,你不需要整个CSV文件中的所有行。也许前100行就足够了。为此,你可以使用nrows参数指定要加载的前n行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start = time.time()

df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 nrows=100)

print(time.time() - start, ' seconds')
display(df[:15])
display(df.info())

从上面的结果中,你可以看到现在只需要0.1秒来加载前100行,生成的DataFrame只占用6.4 KB的空间。

跳过行

有时你可能想要跳过CSV文件中的某些行。要实现这一点,可以使用skiprows参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=2,
                 nrows=100
)
display(df[:15])

上面的结果显示跳过了CSV文件的前两行:

你可以跳过制定行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=[0,2,4],
                 nrows=100
)
display(df[:15])

上面的结果显示跳过了第0、2和4行:

你也可以使用一个range对象来指定要跳过的行范围:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=range(5,10),
                 nrows=100
)
display(df[:15])

上面的结果显示跳过了第5到9行。skiprows参数的值也可以用lambda函数编写,像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=lambda x: 5 <= x < 10,
                 nrows=100
)

使用lambda函数,你可以跳过所有偶数行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=lambda x: x % 2 == 0,
                 nrows=100
)

print(time.time() - start, ' seconds')
display(df[:15])

上面的结果显示跳过了所有偶数行:

加载特定行

到目前为止,你已经学会了如何加载前n行,以及如何跳过CSV文件中的特定行。那么如何加载CSV文件中的特定行呢?虽然没有允许你这样做的参数,但你可以利用skiprows参数来实现你想要的效果。

使用skiprows参数中的lambda函数,你可以指定不跳过的行(实际上就是你想要加载的行):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start = time.time()

df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=lambda x: x not in [1,3],
                 nrows=100
)

print(time.time() - start, ' seconds')
display(df[:15])
display(df.info())

上面的结果显示保留了序号为1和3的行:

这种方法的缺点是必须扫描整个CSV文件,因此加载仅两行需要20秒。

加载最后的n行数据

要讨论的最后一个挑战是如何从CSV文件中加载最后的n行数据。加载前n行数据很容易,但加载最后的n行并不那么直接。但是你可以利用到目前为止学到的知识来解决这个问题。

首先,统计CSV文件中有多少行数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# read the last n rows
start = time.time()

row_count = sum(1 for l in open('custom_1988_2020.csv')) 

print(time.time() - start, ' seconds')
row_count

由于CSV文件中有超过1亿行数据,统计行数大约需要10秒。还要记住,对于这个CSV文件,没有标题行。所以113607322是实际的记录行数。

然后,要加载最后的20行数据,可以使用skiprows参数,并传递一个lambda函数来跳过除了最后的20行之外的所有行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# read the last n rows
start = time.time()

df = pd.read_csv("custom_1988_2020.csv", 
                 header=None, 
                 names=['YearMonth', 'ExportImport', 'HSCode', 'Customs', 
                        'Country', 'Q1', 'Q2_Quantity', 'Value'],                 
                 skiprows=lambda x: 0 <= x < row_count - 20,
                 nrows=100)

print(time.time() - start, ' seconds')
display(df)
display(df.info())

结果显示了最后的20行数据加载到了Pandas DataFrame中。

与前面的部分一样,缺点是在加载过程中必须扫描整个CSV文件(因此加载DataFrame需要22秒)。

总结

在本文中,介绍了许多从CSV文件加载Pandas DataFrame的技巧。通常情况下,没有必要将整个CSV文件加载到DataFrame中。通过仅加载所需的数据,你不仅可以节省加载所需数据的时间,还可以节省内存,因为DataFrame需要的内存更少。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python数据清洗
数据的质量直接关乎最后数据分析出来的结果,如果数据有错误,在计算和统计后,结果也会有误。 所以在进行数据分析前,我们必须对数据进行清洗。需要考虑数据是否需要修改、如何修改调整才能适用于之后的计算和分析等。
Python疯子
2018/09/06
2.5K0
pandas 读取csv 数据 read_csv 参数详解
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 主要引入了两种新的数据结构:DataFrame 和 Series。
上海-悠悠
2024/04/18
8420
pandas 读取csv 数据 read_csv 参数详解
史上最全!用Pandas读取CSV,看这篇就够了
导读:pandas.read_csv接口用于读取CSV格式的数据文件,由于CSV文件使用非常频繁,功能强大,参数众多,因此在这里专门做详细介绍。
CDA数据分析师
2021/08/05
76.7K2
史上最全!用Pandas读取CSV,看这篇就够了
Pandas数据读取:CSV文件
Pandas 是 Python 中一个强大的数据分析库,它提供了大量的工具用于数据操作和分析。其中,read_csv 函数是 Pandas 中最常用的函数之一,用于从 CSV 文件中读取数据。本文将详细介绍 read_csv 的基本用法,常见问题及其解决方案,并通过代码案例进行说明。
Jimaks
2024/12/18
4470
Python基础-Pandas
提供了高效地操作大型数据集所需的工具,支持数据上做各种变化。 为Python提供高性能、易使用的数据结构和数据分析工具。 用于数据挖掘和数据分析,同时也提供数据清洗功能。 使用时先导入 import pandas as pd (往后的调用只需要输入pd即可,当然也可以把as pd 改成任何使用者喜欢的词汇,比如 as AB 之类的) 里面有两大数据结构在很多情况下都会用到: Series 和 DataFrame。
凑齐六个字吧
2024/07/25
1450
Python基础-Pandas
Python读写csv文件专题教程(1)
Python的数据分析包Pandas具备读写csv文件的功能,read_csv 实现读入csv文件,to_csv写入到csv文件。每个函数的参数非常多,可以用来解决平时实战时,很多棘手的问题,比如设置某些列为时间类型,当导入列含有重复列名称时,当我们想过滤掉某些列时,当想添加列名称时...
double
2019/05/23
1.8K0
pandas.read_csv 详细介绍
《Pandas 教程》 修订中,可作为 Pandas 入门进阶课程、Pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: sinbam 和关注公众号「盖若」ID: gairuo。查看更新日志。
Twcat_tree
2022/12/05
5.4K0
20个经典函数细说Pandas中的数据读取与存储
大家好,今天小编来为大家介绍几个Pandas读取数据以及保存数据的方法,毕竟我们很多时候需要读取各种形式的数据,以及将我们需要将所做的统计分析保存成特定的格式。
用户6888863
2021/12/10
3.2K0
20个经典函数细说Pandas中的数据读取与存储
Python数据处理从零开始----第二章(pandas)⑧pandas读写csv文件(2)
image.png 我们现在将学习如何使用Pandas read_csv并跳过x行数。 幸运的是,我们只使用skiprows参数非常简单。 在下面的示例中,我们使用read_csv和skiprows = 3来跳过前3行。
用户1359560
2019/02/22
7180
Python数据处理从零开始----第二章(pandas)⑧pandas读写csv文件(2)
Pandas read_csv 参数详解
在使用 Pandas 进行数据分析和处理时,read_csv 是一个非常常用的函数,用于从 CSV 文件中读取数据并将其转换成 DataFrame 对象。read_csv 函数具有多个参数,可以根据不同的需求进行灵活的配置。本文将详细介绍 read_csv 函数的各个参数及其用法,帮助大家更好地理解和利用这一功能。
霍格沃兹测试开发Muller老师
2024/04/25
5170
使用pandas进行文件读写
pandas是数据分析的利器,既然是处理数据,首先要做的当然是从文件中将数据读取进来。pandas支持读取非常多类型的文件,示意如下
生信修炼手册
2020/06/24
2.2K0
使用pandas进行文件读写
python-004_pandas.read_csv函数读取文件
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
用户7886150
2020/12/26
1.7K0
Pandas-27.文件读取
read_csv和readtable()可以将文件中的内容转换为DataFrame对象:
悠扬前奏
2019/05/29
5440
《Pandas 1.x Cookbook · 第二版》第03章 创建和持久化DataFrame
当调用DataFrame构造器时,Pandas会创建一个RangeIndex对象:
SeanCheney
2021/03/02
1.4K0
《Pandas 1.x Cookbook · 第二版》第03章 创建和持久化DataFrame
pandas.read_csv() 处理 CSV 文件的 6 个有用参数
pandas.read_csv 有很多有用的参数,你都知道吗?本文将介绍一些 pandas.read_csv()有用的参数,这些参数在我们日常处理CSV文件的时候是非常有用的。
deephub
2022/11/11
2.1K0
pandas.read_csv() 处理 CSV 文件的 6 个有用参数
Pandas 2.2 中文官方教程和指南(十·二)
将多级索引的 DataFrames 存储为表与存储/选择同质索引的 DataFrames 非常相似。
ApacheCN_飞龙
2024/05/24
5650
分享30个超级好用的Pandas实战技巧
今天小编来和大家分享几个Pandas实战技巧,相信大家看了之后肯定会有不少的收获。
用户6888863
2022/06/08
6700
分享30个超级好用的Pandas实战技巧
《Pandas Cookbook》第09章 合并Pandas对象
In[1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt
SeanCheney
2018/10/18
2K0
《Pandas Cookbook》第09章 合并Pandas对象
pandas 读取excel文件
举一个IO为文件对象的例子, 有些时候file文件路径的包含较复杂的中文字符串时,pandas 可能会解析文件路径失败,可以使用文件对象来解决。
全栈程序员站长
2022/11/04
3.9K0
pandas 读取excel文件
Pandas读取TXT文件
本文记录的是如何使用Pandas来读取不同情况下的TXT文件,主要是介绍部分常见参数的使用。
皮大大
2023/08/25
3660
相关推荐
python数据清洗
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验