使用 to_csv 将 Python Pandas DataFrame 导出到 CSV 文件

2023-10-15

The to_csv函数允许您从a写入数据PandasDataFrame 到 CSV 文件。

当您需要保存、共享或导出数据以便在不同的环境或应用程序中进一步使用或分析时,这非常有用。

它带有多个参数,可帮助您根据需要自定义流程。
例如,您可以选择分隔符来分隔数据、决定是否包含标题和索引、选择要包含的列等等。

在本教程中,我们将深入研究这些参数的细节以及如何有效地使用它们。

 

 

基本语法和参数

使用的基本语法to_csvPandas 中的函数如下:


DataFrame.to_csv(path_or_buf=None, sep=',', index=True, header=True, columns=None, mode='w', compression='infer', encoding=None, decimal='.', quotechar='"', line_terminator=None, chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal=',')
  

让我们详细讨论一下关键参数:

  • path_or_buf:该参数用于指定应写入数据的文件路径或对象。如果未指定,则输出将以字符串形式返回。
  • sep:这是结果输出中字段之间使用的分隔符。默认值为逗号(‘,’)。
  • index:这是一个布尔值,用于写入行名称(索引)。如果True,它将索引写入 CSV 文件中的第一列。默认为True.
  • header:这用于写出列名称。如果True,它将列名称写入 CSV 文件中。默认为True.
  • columns:此参数允许您指定要写入的列。传递您希望包含在输出中的列名称列表。
  • mode:用于指定文件的打开方式。默认为“w”,代表写入模式。
  • compression:指定输出 CSV 文件的压缩模式。如果是“infer”,那么它使用 gzip、bz2、zip 或 xz 如果path_or_buf是分别以“.gz”、“.bz2”、“.zip”或“.xz”结尾的字符串。
  • encoding:用于指定要写入文件的编码类型。
  • decimal:这是一个字符串,指示被识别为小数点分隔符的字符。默认为“.”。
  • quotechar:这是一个单字符字符串,用于引用包含特殊字符(例如分隔符或引号字符)或包含换行符的字段。默认为“”。
  • lineterminator:这是用于终止输出中生成的行的字符。
  • chunksize:如果指定,Pandas 将以该大小的块写入输出。
  • date_format:这用于指定文件中任何日期数据的日期格式。
  • doublequote:这控制如何处理字段内的引号字符。如果True,字符加倍。如果False and escaping未设置,quotechar 将被删除。
  • escapechar:这指定一个单字符字符串,用于在引用设置为“QUOTE_NONE”时转义分隔符。
    这些参数控制 CSV 写入过程的各个方面,并允许您详细管理输出。

 

如何使用自定义分隔符?

您可以使用sep参数指定不同的字符作为字段分隔符:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
df.to_csv('data.csv', sep=';')
  

data.csv的内容:


,Name,Age,Country
0,John,28,USA
1,Anna,24,UK
2,Peter,22,Canada
  

在上面的代码中,我们首先创建了一个数据框。然后我们使用了to_csv函数将 DataFrame 写入 CSV 文件,但我们指定sep=';'使用分号作为字段分隔符而不是默认的逗号。

 

如何删除索引列?

默认情况下,to_csvPandas 中的函数将 DataFrame 的索引作为输出 CSV 文件中的第一列。

如果您想将 DataFrame 写入没有索引的 CSV 文件,您可以通过设置index参数为False。具体方法如下:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
df.to_csv('data_no_index.csv', index=False)
  

data_no_index.csv的内容:


Name,Age,Country
John,28,USA
Anna,24,UK
Peter,22,Canada
  

在上面的代码中,我们创建了一个 DataFrame,然后将其写入 CSV 文件,设置index=False从输出中排除索引。

结果,CSV文件直接以列名和相应的数据开头,并且索引列已被删除。

 

自定义列标题

将 DataFrame 导出到 CSV 文件时,您可能需要更改列标题。

您可以通过将新列名称列表传递给header的参数to_csv功能:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
new_headers = ['First Name', 'Age in Years', 'Country of Origin']
df.to_csv('data_custom_headers.csv', header=new_headers)
  

data_custom_headers.csv的内容:


,First Name,Age in Years,Country of Origin
0,John,28,USA
1,Anna,24,UK
2,Peter,22,Canada
  

在此代码中,我们首先创建了一个 DataFrame,然后创建了新列标题的列表。然后,我们使用以下命令将 DataFrame 导出到 CSV 文件:to_csv函数,将新的标头列表传递给header范围。
此方法允许您自定义 CSV 文件中的列标题,从而使您能够灵活地使数据更易于理解并更符合您的需求。

 

具体的栏目怎么写呢?

有时,您可能只想将 DataFrame 中的某些列导出到 CSV 文件。 Pandas 让这一切变得简单columns的参数to_csv功能。

您可以传递要包含在输出中的列名称的列表。这是一个例子:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada'],
        'Salary': [50000, 60000, 70000]}
df = pd.DataFrame(data)
df.to_csv('data_specific_columns.csv', columns=['Name', 'Country'])
  

data_specific_columns.csv的内容:


,Name,Country
0,John,USA
1,Anna,UK
2,Peter,Canada
  

在上面的代码中,我们创建了一个包含四列的 DataFrame:“Name”、“Age”、“Country”和“Salary”。将 DataFrame 导出到 CSV 文件时,我们仅包含“名称”和“国家/地区”列。

我们通过将这些列名称的列表传递给columns的参数to_csv功能。

 

通过压缩控制 CSV 文件大小

The compression参数允许您指定输出 CSV 文件的压缩方法。以下是如何使用它的示例:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'] * 10000,
        'Age': [28, 24, 22] * 10000,
        'Country': ['USA', 'UK', 'Canada'] * 10000}
df = pd.DataFrame(data)
df.to_csv('data_compressed.zip', compression='zip')
  

在此代码中,我们首先创建了一个大型 DataFrame。然后,我们使用以下命令将其导出到压缩的 CSV 文件to_csv函数,指定“zip”作为压缩方法compression范围。

 

如何处理编码问题?

The encoding参数允许您在写入 CSV 文件时指定编码。
以下是如何使用它的示例:


import pandas as pd
data = {'Name': ['Jöhn', 'Ánna', 'Péter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
df.to_csv('data_utf8.csv', encoding='utf-8')
  

data_utf8.csv的内容:


,Name,Age,Country
0,Jöhn,28,USA
1,Ánna,24,UK
2,Péter,22,Canada
  

在上面的代码中,我们的 DataFrame 在“Name”列中包含特殊字符。

将 DataFrame 写入 CSV 文件时,我们指定encoding='utf-8'以确保正确处理这些特殊字符。
一般来说,“utf-8”是一种安全的编码选择,因为它可以处理 Unicode 标准中的任何字符。但是,您可以使用许多不同类型的编码,具体取决于您的具体要求。
请记住在将 CSV 文件读回 DataFrame 时始终指定编码:pd.read_csv,使用与写入文件相同的编码。

 

使用不同的小数点分隔符?

The decimal参数允许您在使用以下命令写入 CSV 文件时设置小数点分隔符to_csv功能。

这是如何使用的示例decimal范围:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Score': [75.5, 80.6, 90.1]}
df = pd.DataFrame(data)
df.to_csv('data_decimal.csv', sep=';', decimal=',')
  

data_decimal.csv的内容:


;Name;Score
0;John;75,5
1;Anna;80,6
2;Peter;90,1
  

在上面的代码中,我们的 DataFrame 在“Score”列中包含带小数点的数值。将 DataFrame 写入 CSV 文件时,我们指定decimal=','使用逗号作为小数点分隔符。

此外,我们使用分号作为字段分隔符(sep=';') 以避免与小数点逗号混淆。

 

使用引号和转义字符导出

在某些情况下,您的数据可能包含特殊字符,在写入 CSV 文件时需要小心处理。

这些可能包括数据值中的分隔符、引号或转义字符。

The to_csvpandas 中的函数提供了几个参数来控制这些参数的处理方式:sep, quotechar, and escapechar.
以下是如何使用这些参数的示例:


import pandas as pd
data = {'Name': ['John, Jr.', 'Anna "The Queen"', 'Peter|The Great'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
df.to_csv('data_special_chars.csv', sep='|', quotechar='"', escapechar='\\', index=False)
  

data_special_chars.csv的内容:


Name|Age|Country
"John, Jr."|28|USA
"Anna ""The Queen"""|24|UK
"Peter\|The Great"|22|Canada
  

在上面的代码中,我们的 DataFrame 包含带有逗号、引号和竖线字符的值。我们使用管道字符(‘|’)作为字段分隔符sep='|'.

我们指定双引号将包含特殊字符的字段括起来quotechar='"'。我们还使用反斜杠作为转义字符escapechar='\\'.

 

如何使用不同的行终止符编写 CSV 文件?

The lineterminator参数允许您指定如何终止每行。假设我们想在行之间创建一个空行,这意味着两个换行符('\n\n'):


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22],
        'Country': ['USA', 'UK', 'Canada']}
df = pd.DataFrame(data)
df.to_csv('data_line_terminator.csv', lineterminator='\n\n')
  

data_line_terminator.csv 的内容(可视化为原始字符串):


,Name,Age,Country

0,John,28,USA

1,Anna,24,UK

2,Peter,22,Canada
  

在这段代码中,我们设置了lineterminator='nn',将 DataFrame 写入 CSV 文件时,会在每行后面添加一个空行。

 

使用日期和时间

The date_format参数允许您按照您想要的方式控制日期列的格式。


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'],
        'Date': pd.date_range(start='1/1/2022', periods=3, freq='D')}
df = pd.DataFrame(data)
df.to_csv('data_date_format.csv', date_format='%Y-%m-%d %H:%M:%S')
  

data_date_format.csv的内容:


,Name,Date
0,John,2022-01-01 00:00:00
1,Anna,2022-01-02 00:00:00
2,Peter,2022-01-03 00:00:00
  

在上面的代码中,我们的 DataFrame 在“日期”列中包含日期。

将 DataFrame 写入 CSV 文件时,我们指定date_format='%Y-%m-%d %H:%M:%S'。这会将日期格式化为年-月-日时:分:秒格式。

 

导出大型数据集

The chunksize参数允许您指定一次要写入的行数。
这是一个如何使用的示例chunksize范围:


import pandas as pd
data = {'Name': ['John', 'Anna', 'Peter'] * 100000,
        'Age': [28, 24, 22] * 100000,
        'Country': ['USA', 'UK', 'Canada'] * 100000}
df = pd.DataFrame(data)
df.to_csv('large_data.csv', chunksize=1000)
  

在上面的代码中,我们创建了一个大的 DataFrame。将 DataFrame 写入 CSV 文件时,我们指定chunksize=1000一次写入 1000 行。

这意味着 Pandas 将以 1000 行为一个块将 DataFrame 写入文件,从而有助于控制内存使用。

 

将多个 Pandas DataFrame 保存到单个 CSV 文件

如果要将 DataFrame 附加到现有 CSV 文件或将多个 DataFrame 写入 CSV 文件,可以通过设置以附加模式打开它mode参数为mode='a'.

默认情况下,mode='w',这意味着文件已打开进行写入,并且任何现有内容都将被覆盖。

以下是如何将多个 DataFrame 附加到单个 CSV 文件的示例:


import pandas as pd
data1 = {'Name': ['John', 'Anna', 'Peter'],
         'Age': [28, 24, 22]}
df1 = pd.DataFrame(data1)

data2 = {'Name': ['Michael', 'Sarah', 'Jessica'],
         'Age': [30, 27, 25]}
df2 = pd.DataFrame(data2)

df1.to_csv('data_append.csv', index=False)
df2.to_csv('data_append.csv', mode='a', header=False, index=False)
  

data_append.csv的内容:


Name,Age
John,28
Anna,24
Peter,22
Michael,30
Sarah,27
Jessica,25
  

在上面的代码中,我们首先写了df1到 CSV 文件。然后我们附加了df2到同一个文件mode='a'。我们还设置了header=False追加时df2以防止再次写入列标题。

 

如何将 CSV 文件写入远程位置

While to_csv()函数不直接支持写入远程位置,您可以通过使用允许Python与云存储交互的附加库来完成此任务,例如boto3对于亚马逊 S3,gcsfs对于 Google 云存储,或azure-storage-blob用于 Azure Blob 存储。
以下示例展示了如何使用以下命令将 DataFrame 写入 Amazon S3 存储桶中的 CSV 文件:boto3:


import pandas as pd
import boto3
from io import StringIO
data = {'Name': ['John', 'Anna', 'Peter'],
        'Age': [28, 24, 22]}
df = pd.DataFrame(data)
csv_buffer = StringIO()
df.to_csv(csv_buffer, index=False)

s3 = boto3.resource('s3', aws_access_key_id='YOUR_ACCESS_KEY',
                    aws_secret_access_key='YOUR_SECRET_KEY')

# write dataframe to a csv file in the s3 bucket
s3.Object('your-bucket-name', 'df_s3.csv').put(Body=csv_buffer.getvalue())
  

在上面的代码中,我们首先使用以下命令将 DataFrame 转换为 CSV 格式字符串to_csv()方法和实例StringIO作为文件缓冲区。

然后我们创建一个 S3 资源对象并使用put()方法将字符串写入 S3 存储桶中的文件。
记得更换'YOUR_ACCESS_KEY' and 'YOUR_SECRET_KEY'使用您的实际 AWS 访问密钥和秘密密钥,以及'your-bucket-name'与您的 S3 存储桶的名称。

 

to_csv 更广泛的兼容性

在我工作的电信公司,数据是我们运营的核心——每次连接、呼叫、文本或数据传输都会生成一个数据点。

我们拥有超过 6000 万订阅者,每个订阅者每天都会生成多个事件,您可以想象我们正在处理的数据集有多么庞大。

曾经有一段时间,我们被要求创建一份有关客户使用趋势的综合报告。这项任务非常艰巨,因为它涉及整理和分析包含超过十亿条记录的数据集。然而,数据分析只是挑战的一部分。

更大的问题是如何与团队其他成员有效地分享这些发现,特别是需要根据这些数据做出战略决策的非技术经理。

我清理并准备了 Pandas DataFrame 中的数据集,包括数十亿行和大约十几列,从调用时间戳到数据使用情况。但当需要导出这些数据时,我需要做出一个决定:我应该选择哪种格式?

Excel 是一种选择,但考虑到数据集的大小,这是不可行的。 Excel 每张工作表的限制约为 100 万行,而我们的数据集比该限制大一千倍以上。

JSON 是另一种选择。然而,JSON 会导致复杂的嵌套结构,管理人员很难使用他们熟悉的工具来解析和理解。

这就是熊猫的地方to_csv开始发挥作用了。我们的经理习惯于处理 CSV 文件。他们拥有一套工具,有些是自制的,有些是现成的,例如 Tableau,用于对数据进行切片、切块和可视化。但是,这些工具仅接受 CSV 输入。

所以,我选择使用to_csv函数导出数据框。该函数优雅地处理了数据的大小,并允许我以块的形式导出文件。事实上,我导出的 CSV 文件大小约为 16GB。

事实证明,选择 CSV 是一个救星。经理们能够直接将该文件导入到他们的工具中并提取有意义的见解。

CSV 文件的易用性和兼容性使预处理数据所花费的时间减少了 50%,减少了 30% 的查询以及数据格式和结构方面的混乱。

使用熊猫to_csv确保公司中的每个人(即使是没有技术背景的人)都可以轻松理解、利用我们从数据中得出的见解并采取行动。它有力地证明了正确选择数据格式如何能够改变世界。

 

进一步阅读

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 to_csv 将 Python Pandas DataFrame 导出到 CSV 文件 的相关文章

随机推荐

  • 学习 Python 编程的 11 个初学者技巧

    目录 Make It Stick 提示 1 每天编码 技巧 2 写下来 提示 3 互动 秘诀 4 休息一下 提示 5 成为 Bug 赏金猎人 Make It Collaborative 提示 6 让自己周围都是正在学习的人 秘诀 7 教学
  • Python 对象的浅复制与深复制

    目录 制作浅副本 制作深层副本 复制任意Python对象 3 件事要记住 Python 中的赋值语句不会创建副本对于对象 它们仅将名称绑定到对象 为了不可变的对象 通常没有什么区别 但对于与可变的对象或可变对象的集合 您可能正在寻找一种方法
  • Pythonic 壁纸包

    通过以下方式表达您对 Python 的热爱 The Pythonic Wallpapers Pack 原价 9 99 美元 今日仅需 4 99 美元 使用这些为您的计算机 手机或平板电脑定制的独特壁纸 向世界展示您是 Python 达人 你
  • 理解 Python print() 函数:超越 Hello World

    您可能想知道 为什么要写一个关于简单打印功能的完整教程 但不要被欺骗 谦卑者print 函数虽然使用简单 但却是 Python 工具库中不可或缺的工具 本教程将引导您了解使用print 函数 探索其语法和参数 然后深入研究更高级的主题 您将
  • 在 Python 中删除字符串中标点符号的 5 种方法

    Python 提供了多种删除标点符号的方法 这里的目标是将字符串中的每个标点字符替换为空字符串 让我们为所有示例考虑以下原始字符串 original string Hello World Let s test some punctuatio
  • PyQt5 教程 – Python GUI 编程示例

    PyQt5 是用 Python 构建 GUI 应用程序时最常用的模块之一 这是因为它的简单性 正如您将看到的那样 鼓励开发人员使用 PyQt5 的另一个重要功能是 PyQt5 设计器 它使得在短时间内开发复杂的 GUI 应用程序变得非常容易
  • Python GUI 示例(Tkinter 教程)

    在本教程中 我们将通过使用 Tkinter 包编写一些 Python GUI 示例来学习如何开发图形用户界面 Tkinter 包作为标准包随 Python 一起提供 因此我们不需要安装任何东西即可使用它 Tkinter 包是一个非常强大的包
  • Python 中的凯撒密码(文本加密教程)

    密码学涉及将一条信息 以纯文本形式 加密或编码为一种看起来乱码且在普通语言中毫无意义的形式 此编码消息 也称为密文然后 目标接收者可以使用传达给最终用户的解码技术 通常与私钥一起 将其解码回纯文本 凯撒密码是我们将在本教程中重点介绍的最古老
  • 安装和使用非 Composer Laravel 包

    如果你想在 Laravel 中使用包 你只需在 Composer json 文件中添加一行即可完成工作 这是因为该包在 packagist org 中可用 如果您要使用的包是非 Composer Laravel 包怎么办 可能在 git 存
  • 文本处理中 Awk 命令的 30 个示例

    在上一篇文章中 我们谈到了sed命令我们看到了许多在文本处理中使用它的例子 我们看到了它在这方面的优点 但它有一些局限性 有时您需要一些强大的功能 让您能够更好地控制数据处理 这是哪里awk 命令进来 awk 命令或具体的 GNU awk
  • 安装、保护、访问和配置 Linux 邮件服务器 (Postfix)

    如果您想发送或接收电子邮件 您应该有一个邮件服务器 在这篇文章中 我们将讨论 Linux 邮件服务器以及 SMTP 简单邮件传输协议 以及其他邮件相关协议 例如邮局协议 POP 和互联网消息访问协议 IMAP 的工作原理以及它们之间的关系他
  • 了解和使用 Linux Subshel​​l(实用指南)

    子shell是由shell启动的子进程 shell本质上是一个命令行解释器 它共享父 shell 的属性 但在单独的进程空间中运行 子 shell 为执行命令和运行脚本提供了隔离性和灵活性 子 shell 通常用于任务自动化 并行执行和模块
  • 加速您的 Python 代码:Numba 实用指南

    Numba 是一个开源 JIT 编译器 可以翻译以下代码的子集Python and NumPy代码转换为快速机器代码 它通过使用行业标准的 LLVM 编译器库并优化执行速度来加速数值计算 在本教程中 我们将探索如何使用 Numba 使 Py
  • Linux 正则表达式教程(Sed 和 AWK)示例

    为了成功地与Linux sed编辑和awk 命令在 shell 脚本中 您必须了解正则表达式或简称正则表达式 由于正则表达式有很多引擎 我们将使用 shell 正则表达式并了解 bash 在使用正则表达式方面的强大功能 首先 我们需要了解什
  • 10 多个在 Linux 中终止进程的示例

    在本教程中 我们将通过多个示例讨论如何终止 Linux 中的进程 在大多数情况下 就像输入 kill 命令然后输入进程 ID 通常缩写为 PID 一样简单 正如你所看到的 我们杀死了一个ID为1813的进程 如果您是 Windows 用户
  • 如何安装和配置 Squid Linux 代理服务器

    Linux代理服务器或代理服务器通常是保存访问过的网页以供以后请求的服务器 因此如果您尝试访问同一个网页或其他任何人 您将从代理服务器获取页面 这非常有用 它使网上冲浪速度更快并减少流量 这意味着成本更低 缓存服务器可以将外部流量减少至 4
  • 使用 Sed 命令进行文本替换的实际示例

    在本教程中 您将深入研究如何使用实际示例sed命令可用于文本替换 在本教程结束时 您将对以下方面有更深入的了解sed及其在文本替换中的实际应用 目录 hide 1 将 URL 中的 HTTP 更改为 HTTPS 2 用下划线替换空格 3 更
  • 数据帧过滤:在 Pandas 查询中使用正则表达式

    The 查询 方法Pandas 中允许您根据查询表达式过滤 DataFrame 行 将正则表达式 regex 的强大功能与query 方法允许更高级和灵活的查询 本教程将指导您完成使用正则表达式的过程query 熊猫中的方法 目录 hide
  • 使用 to_xml 将 Pandas DataFrame 转换为 XML 文件

    The to xml方法允许您将 DataFrame 转换为 XML 格式 在本教程中 我们将逐步完成导出Pandas使用 DataFrame 到 XML 文件to xml method 目录 hide 1 Pandas to xml 语法
  • 使用 to_csv 将 Python Pandas DataFrame 导出到 CSV 文件

    The to csv函数允许您从a写入数据PandasDataFrame 到 CSV 文件 当您需要保存 共享或导出数据以便在不同的环境或应用程序中进一步使用或分析时 这非常有用 它带有多个参数 可帮助您根据需要自定义流程 例如 您可以选择