The to_csv
函数允许您从a写入数据PandasDataFrame 到 CSV 文件。
当您需要保存、共享或导出数据以便在不同的环境或应用程序中进一步使用或分析时,这非常有用。
它带有多个参数,可帮助您根据需要自定义流程。
例如,您可以选择分隔符来分隔数据、决定是否包含标题和索引、选择要包含的列等等。
在本教程中,我们将深入研究这些参数的细节以及如何有效地使用它们。
基本语法和参数
使用的基本语法to_csv
Pandas 中的函数如下:
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_csv
Pandas 中的函数将 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_csv
pandas 中的函数提供了几个参数来控制这些参数的处理方式: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