跳至主要内容

如何将 Pandas DataFrame 保存为 CSV

在 Pandas 中,您可以使用 df.to_csv('your_file_name.csv', index=False) 方法将 DataFrame 保存为 CSV 文件,其中 df 是您的 DataFrame,index=False 可防止添加索引列。
· 7分钟 阅读

使用 AI 探索

如果您创建了一个 DataFrame 或修改了已有的 DataFrame,可能希望将其导出,方便他人使用,或留作今后工作之用。比如,您可能需要向评审提交机器学习项目的预测结果,或将修改后的数据集发给同事。

在 Python 中,您可以使用 Pandas 的 .to_csv() 方法将 DataFrame 导出为 CSV 文件。

在本文中,我将带您完成主要步骤,并解释该方法的各个参数。

如果您想进一步学习 Pandas,可以看看这门课程:使用 Pandas 进行数据处理。

我会先给赶时间的读者一个快速答案,然后再展开细节。

简短回答:如何将 Pandas DataFrame 保存为 CSV

要将 Pandas DataFrame 保存为 CSV,请使用 DataFrame.to_csv() 方法:

df.to_csv('your_file_name.csv', index=False)

将 'your_file_name.csv' 替换为您想要的文件名和路径。参数 index=False 可防止 Pandas 向 CSV 中添加索引列。

创建一个 Pandas DataFrame

现在来看更完整的答案。我不会从零构建 DataFrame,而是导入一个数据集,对其进行修改,然后将结果 DataFrame 以 CSV 格式保存。第一步是导入所需库:

import pandas as pd
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler

接着,我们可以导入一个 seaborn 数据集。导入的数据集已经是 Pandas DataFrame,因此无需转换。

# 我们将从 seaborn 导入 'titanic' 数据集
df = sns.load_dataset('titanic')
print(df.head())
survived  pclass     sex   age  sibsp  parch     fare embarked  class  
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third 
    who  adult_male deck  embark_town alive  alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True  

修改一个 Pandas DataFrame

现在,我们做一些处理来得到一个新的 DataFrame。由于我的目的是讲解 Pandas 的 .to_csv() 方法,我只对数值型变量做最小-最大归一化。

scaler = MinMaxScaler()
# 选择具有整数或浮点数据类型的列                                           
numerical columns - df.select_dtypes(include=['float64','int64']).columns
new_df = df.copy()
# 最小-最大缩放器会将所有数值映射到 0 到 1 的区间
new_df[numerical_columns] = scaler.fit_transform(df[numerical_columns])
print(new_df.head())
survived  pclass     sex       age  sibsp  parch      fare embarked    
0       0.0     1.0    male  0.271174  0.125    0.0  0.014151        S  
1       1.0     0.0  female  0.472229  0.125    0.0  0.139136        C  
2       1.0     1.0  female  0.321438  0.000    0.0  0.015469        S  
3       1.0     0.0  female  0.434531  0.125    0.0  0.103644        S  
4       0.0     1.0    male  0.434531  0.000    0.0  0.015713        S  
class   who  adult_male deck  embark_town alive  alone  
Third   man        True  NaN  Southampton    no  False  
First   woman      False   C    Cherbourg   yes  False  
Third   woman      False NaN  Southampton   yes   True  
First   woman      False   C  Southampton   yes  False  
Third   man        True  NaN  Southampton    no   True  

将 Pandas DataFrame 保存为 CSV

我们将使用 DataFrame.to_csv() 方法将修改后的 DataFrame 保存为 CSV 文件。

new_df.to_csv('new_titanic.csv') 

这会将 CSV 文件保存在当前目录。如果您需要复习,请阅读这篇教程:如何在 Python 中获取当前目录。

我调用该方法的方式使所有参数均为默认值。现在,我将介绍这些参数,以及如何根据需要调整它们的取值。

DataFrame.to_csv() 的参数详解

下面列出了同一个 .to_csv() 方法的所有参数:

new_df.to_csv(
    path_or_buf='new_titanic.csv',
    sep=',',
    na_rep='',
    float_format=None,
    columns=[],
    header=True,
    index=True,
    index_label=None,
    mode='w',
    encoding='utf-8',
    quoting=csv.QUOTE_MINIMAL,
    lineterminator=os.linesep,
    storage_options={},
    compression='infer',
    quotechar='',
    chunksize=None,
    date_format=None,
    doublequote=True,
    escapechar=None,
    decimal='.',
    errors='strict'
)

其中一些参数是可选的,如 columns、encoding、 quoting、 lineterminator 和 storage_options,因此我只是为它们设置了值,不一定是默认值。

第一个参数可以是字符串(即文件名),也可以是文件对象。请看下面的示例:

with open('new_titanic.csv',  'w', encoding = 'utf=8') as file:
     new_df.to_csv(file)

分隔符与缺失值

下一个参数是分隔符,用于指定数据如何分隔。默认分隔符是逗号,但我们可以将其改为制表符或分号。当导出的数据需要特定格式时,使用制表符或分号会很有用。此外,对于包含逗号的数据(如文本),使用逗号作为分隔符可能会带来不必要的变化。

例如,如果您有“Hello, world” 这样的数据点,那么在使用逗号作为分隔符时,您还需要使用引号来保证它作为单个数据点。改用制表符或分号可能是更好的选择,因为与逗号加引号相比,它可能占用更少内存。

new_df.to_csv('new_titanic.csv', sep = '\t')
new_df_tab = pd.read_csv('new_titanic.csv')
0\t0\t3\tmale\t22.0\t1\t0\t7.25\tS\tThird\tman...                                                                 
1\t1\t1\tfemale\t38.0\t1\t0\t71.2833\tC\tFirst...                                                                 
2\t1\t3\tfemale\t26.0\t0\t0\t7.925\tS\tThird\t...                                                                 
3\t1\t1\tfemale\t35.0\t1\t0\t53.1\tS\tFirst\tw...                                                                 
4\t0\t3\tmale\t35.0\t0\t0\t8.05\tS\tThird\tman... 

第三个参数 na_rep 用于指定缺失值的表示方式。常见做法是将单元格留空,或填入 “NaN” 或 “Na”,但您也可以插入自定义字符串。下面的示例中,我为每个缺失值插入 “Datacamp”。

new_df.to_csv('new_titanic.csv', na_rep='Datacamp')
new_df_datacamp = pd.read_csv('new_titanic.csv') 
new_df_datacamp = pd.DataFrame(new_df_datacamp) 
# 查找缺失值
missing_values = new_df_datacamp.isnull().sum()
print(missing_values)
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0

处理列与索引

让我们看看 age 列中的缺失值是如何表示的:

print(new_df_datacamp['age'][:10])
     0.2711736617240512
     0.4722292033174164
    0.32143754712239253
     0.4345312892686604
     0.4345312892686604
               Datacamp
     0.6732847449107816
    0.01985423473234481
    0.33400351847197784
    0.17064589092736868

如果您希望更少的小数位,可使用 float_format 参数来指定小数位数。这里我们只保留三位小数。

new_df.to_csv('new_titanic.csv', na_rep='Datacamp', float_format='%.3f')
new_df_datacamp = pd.read_csv('new_titanic.csv')
new_df_datacamp = pd.DataFrame(new_df_datacamp)
print(new_df_datacamp['age'][:10])
0.271
0.472
0.321
0.435
0.435
Datacamp
0.673
0.020
0.334
0.171

如果您不想看到索引,请将 index 参数设为 False。

您还可以通过 header 参数决定是否保留列名,设置为 True 或 False 即可(也可以自定义列名)。

columns 参数允许您选择要保留的列。index_label 参数允许为索引列设置名称,或在多级索引时设置名称列表。

new_df.to_csv(
    'new_titanic.csv', 
    index=True, 
    header=True, 
    columns=['age', 'alive'], 
    index_label='Index'
)
new_df = pd.read_csv('new_titanic.csv')
new_df = pd.DataFrame(new_df)
print(new_df.head())
  Index       age alive
      0  0.271174    no
      1  0.472229   yes
      2  0.321438   yes
      3  0.434531   yes
      4  0.434531    no

文件打开方式、编码与压缩

参数 mode 用于决定当已存在同名 CSV 文件时如何处理。如果将其设为 “w”,且已存在 new_titanic.csv 文件,那么新文件会替换旧文件。若设为 “x”,则仅当不存在同名文件时才创建新文件。最后,若设为 “a”,则会将新内容追加到同名旧文件之后(例如您只想新增一些行)。

编码参数用于设置新文件的编码方式。如果您的数据包含特殊字符(例如其他字母表的字符),可以将其设置为 “utf-8” 或其他编码。

compression 参数用于设置新文件的压缩方式。默认值为 “infer”,即根据文件扩展名推断压缩方式,您也可以显式指定所需的压缩格式。

# 推断压缩方式
new_df.to_csv('new_titanic.csv.gz')
# 显式指定压缩方式
new_df.to_csv('new_data.csv.gz', compression='gzip')
# 通过字典指定压缩方式
new_df.to_csv(
    'new_data.zip', 
    compression={
        'method': 'zip', 
        'archive_name': 'data.csv'
    }
)

如何使用引号

quoting 参数用于设置哪些数据需要加引号。正如前面所说,当分隔符为逗号且单元格中也包含逗号(如文本)时,您需要决定哪些字段加引号。

# 默认值,仅为包含特殊字符或分隔符(如制表符和逗号)的字段加引号
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_MINIMAL)
# 为所有字段加引号
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_ALL)
# 仅为非数值型字段加引号
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONNUMERIC)
# 不为任何字段加引号
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONE)

块大小与日期时间数据

参数 chunksize 指定每次写入的行数。若使用默认值,则一次性写入所有行;当文件很大时,您可以指定一个数字以分块写入。

参数 date_format 用于设置 datetime 对象的表示形式。您可以使用 strftime 格式进行指定。

# 将 DataFrame 写入 CSV,并将日期格式化为 'MM/DD/YYYY'
new_df.to_csv('new_titanic.csv', date_format='%m/%d/%Y')
# 可以精确到秒
new_df.to_csv('new_titanic.csv', date_format='%Y-%m-%d %H:%M:%S')

总结

希望现在您已经可以按照自己的需求,将 DataFrame 导出为合适的格式!

鼓励您继续学习——下面是一些可供尝试的资源:

Tudor Mărginean

作者

Tudor Mărginean

我正在罗马尼亚布加勒斯特大学完成数据科学硕士学位,毕业论文围绕基于图神经网络的多种模型进行交通流预测。我主要掌握了使用 Python 和 Power BI 进行数据清洗与可视化、针对各类机器学习任务的数据预处理,以及使用 PyTorch(或 TensorFlow)构建模型。同时,作为哲学专业的博士生,我教授一阶逻辑研讨课,并进行关于贝叶斯证实理论的论文研究。我渴望进一步学习数据与建模,并把所学教给他人。

主题