Pandas 中的 to_csv()
方法用于写入 CSV 文件。
示例
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'San Francisco', 'Los Angeles']
}
df = pd.DataFrame(data)
# use to_csv() to write df to a CSV file
df.to_csv('sample_data.csv')
''
Output
sample_data.csv:
Name,Age,City
Alice,25,New York
Bob,30,San Francisco
Charlie,35,Los Angeles
''
to_csv() 语法
Pandas 中 to_csv()
方法的语法是
df.to_csv(path_or_buf, sep=',', header=True, index=False, mode='w', encoding=None, quoting=None, line_terminator='\n')
to_csv() 参数
to_csv()
方法接受以下常用参数
path_or_buf
(可选) - 表示 DataFrame 将被保存为 CSV 文件的路径或缓冲区对象sep
(可选) - 指定输出 CSV 文件中要使用的分隔符header
(可选) - 指示是否在输出 CSV 文件中包含标题行index
(可选) - 确定是否在输出 CSV 文件中包含索引列mode
(可选) - 指定打开输出文件的模式encoding
(可选) - 设置写入 CSV 文件时要使用的字符编码quoting
(可选) - 确定包含特殊字符的字段的引用行为line_terminator
(可选) - 指定用于终止输出 CSV 文件中行的字符序列
to_csv()返回值
to_csv()
的返回值可以是 none(当写入文件或类文件对象时),或者当未指定文件目标时,返回 DataFrame 的 CSV 格式字符串表示。
示例 1:写入 CSV 文件
import pandas as pd
# create dataframe
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'City': ['New York', 'London', 'Paris', 'Berlin']}
df = pd.DataFrame(data)
# use to_csv() to write to csv file
df.to_csv(path_or_buf='output_path.csv')
在此示例中,我们使用 path_or_buf
参数在 to_csv()
方法中指定要写入的文件名,将 DataFrame 写入名为 output.csv
的 CSV 文件。
我们的 output.csv
将如下所示
,Name,Age,City
0,Tom,20,New York
1,Nick,21,London
2,John,19,Paris
3,Tom,18,Berlin
示例 2:在 CSV 文件中使用不同的分隔符
import pandas as pd
# create dataframe
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'City': ['New York', 'London', 'Paris', 'Berlin']}
df = pd.DataFrame(data)
# use to_csv() to write to csv file with semicolon as the delimiter
# also exclude indices
df.to_csv('output_with_semicolon.csv', sep=';', index=False)
在这里,我们在 to_csv()
中使用了 sep=';'
参数,将文件写入为以分号作为分隔符的 CSV 文件。
此外,我们使用了 index=False
来在写入 CSV 文件时排除索引。
我们的 output_with_semicolon.csv
将如下所示
Name;Age;City
Tom;20;New York
Nick;21;London
John;19;Paris
Tom;18;Berlin
示例 3:使用 header 参数控制列标题
import pandas as pd
# create dataframe
data = {'Name': ['Tom', 'Nick', 'John', 'Tom'],
'Age': [20, 21, 19, 18],
'City': ['New York', 'London', 'Paris', 'Berlin']}
df = pd.DataFrame(data)
# use to_csv() to write to csv file and exclude headers
df.to_csv('output_without_headers.csv', header=False)
在此,由于我们在 to_csv()
中使用了 header=False
,因此列名 Name
、Age
、City
不会出现在输出文件中。
因此,我们的 output_without_headers.csv
将如下所示
0,Tom,20,New York
1,Nick,21,London
2,John,19,Paris
3,Tom,18,Berlin
示例 4:使用 Pandas 写入和追加 CSV 文件
在 Pandas 中,to_csv()
方法中的 mode
参数用于指定打开文件的模式。当
mode='w'
(默认) - 写入模式。它将打开文件进行写入,并且任何具有相同名称的现有文件都将被覆盖。如果文件不存在,则会创建一个新文件。mode='a'
- 追加模式。它将打开文件进行写入,但如果文件已存在,数据将被追加到文件末尾。如果文件不存在,则会创建一个新文件。mode='x'
- 独占创建模式。如果文件已存在,操作将失败。
让我们看一个例子。
import pandas as pd
# create the first DataFrame
data1 = {
'Name': ['Tom', 'Nick', 'John'],
'Age': [20, 21, 19],
'City': ['New York', 'London', 'Paris']
}
df1 = pd.DataFrame(data1)
# write the first DataFrame to the file with headers
df1.to_csv('output.csv', mode='w', header=True, index=False)
# create the second DataFrame
data2 = {
'Name': ['Anna', 'Elsa', 'Olaf'],
'Age': [25, 28, 5],
'City': ['Arendelle', 'Arendelle', 'Arendelle']
}
df2 = pd.DataFrame(data2)
# append the second DataFrame to the same file without headers
df2.to_csv('output.csv', mode='a', header=False, index=False)
在上面的示例中,我们创建了两个 DataFrame df1 和 df2,每个 DataFrame 都包含三个人员的 Name
、Age
和 City
列数据。
首先,我们将 df1 写入 output.csv
,包含列标题且不带行索引。
然后,我们将 df2 追加到 output.csv
,而不再添加标题,从而确保最终文件中包含连续的六个人员列表。
因此,我们的 output.csv
将如下所示
Name,Age,City
Tom,20,New York
Nick,21,London
John,19,Paris
Anna,25,Arendelle
Elsa,28,Arendelle
Olaf,5,Arendelle
示例 5:在写入 CSV 文件时控制引号
to_csv()
方法中的 quoting
参数控制 CSV 文件中值的引用行为。
quoting
参数可以取以下值之一
csv.QUOTE_MINIMAL
(默认) - 仅在需要时引用 (例如,对于逗号或引号等特殊字符)csv.QUOTE_ALL
- 始终引用所有内容csv.QUOTE_NONNUMERIC
- 引用非数字值,保留数字值不引用csv.QUOTE_NONE
- 从不引用任何内容,确保特殊字符手动处理
让我们看一个例子。
import pandas as pd
import csv
data = {
'Name': ['Tom', 'Anna,Smith', 'John"Doe'],
'Age': [25, 30, 40]
}
df = pd.DataFrame(data)
# save with different quoting options
df.to_csv('output_minimal.csv', quoting=csv.QUOTE_MINIMAL, index=False)
df.to_csv('output_all.csv', quoting=csv.QUOTE_ALL, index=False)
df.to_csv('output_nonnumeric.csv', quoting=csv.QUOTE_NONNUMERIC, index=False)
df.to_csv('output_none.csv', quoting=csv.QUOTE_NONE, index=False, escapechar='\\')
在这里,当我们使用 quoting=csv.QUOTE_MINIMAL
时,只有 'Anna,Smith'
被引用,因为它包含逗号,这是默认分隔符。
所以我们的 output_minimal.csv
文件将如下所示
Name,Age
Tom,25
"Anna,Smith",30
John"Doe",40
而当我们使用 quoting=csv.QUOTE_ALL
时,所有值(包括标题)都被引用。请注意,'John"Doe'
中的双引号被另一个双引号转义。
因此,我们的 output_all.csv
文件将如下所示
"Name","Age"
"Tom","25"
"Anna,Smith","30"
"John""Doe","40"
同样,当我们使用 quoting=csv.QUOTE_NONNUMERIC
时,所有非数字字段都被引用。同样,'John"Doe'
中的双引号被另一个双引号转义,但年龄是数字,未被引用。
所以我们的 output_nonnumeric.csv
文件将如下所示
"Name",Age
"Tom",25
"Anna,Smith",30
"John""Doe",40
最后,当我们使用 quoting=csv.QUOTE_NONE
时,不引用任何值,但使用我们设置为反斜杠 \\
的转义字符来转义特殊字符。
因此,我们的 output_none.csv
文件将如下所示
Name,Age
Tom,25
Anna\,Smith,30
John\"Doe,40
示例 6:使用 Pandas 自定义 CSV 行尾符
import pandas as pd
data = {
'Name': ['Tom', 'Alice', 'Bob'],
'Age': [25, 30, 35],
'City': ['New York', 'San Francisco', 'Los Angeles']
}
df = pd.DataFrame(data)
# save with different line terminators
df.to_csv('output_unix.csv', line_terminator='\n', index=False)
df.to_csv('output_tilde.csv', line_terminator='~', index=False)
在这里,当我们使用 line_terminator='\n'
时,CSV 文件将如下所示
Name,Age,City
Tom,25,New York
Alice,30,San Francisco
Bob,35,Los Angeles
而当我们使用 line_terminator='~'
时,CSV 文件将如下所示
Name,Age,City~Tom,25,New York~Alice,30,San Francisco~Bob,35,Los Angeles~