Saltar al contenido principal

Cómo guardar un DataFrame de Pandas en CSV

En Pandas, puedes guardar un DataFrame en un archivo CSV utilizando el método df.to_csv('tu_nombre_de_archivo.csv', index=False), donde df es tu DataFrame e index=False impide que se añada una columna índice.
Actualizado 29 jul 2024  · 7 min de lectura

Si creas un Marco de datos o modificas uno existente, puede que quieras exportarlo para que otras personas puedan trabajar con él, o puedes guardarlo para tu trabajo futuro. Por ejemplo, puede que tengas que presentar una predicción de un proyecto de aprendizaje automático a tu examinador o enviar un conjunto de datos modificado a un compañero de trabajo.

En Python, puedes exportar un DataFrame como un archivo CSV utilizando el método .to_csv() de Pandas .

En este artículo, te guiaré por los principales pasos del proceso y te explicaré los parámetros del método.

Si quieres aprender más sobre Pandas, consulta este curso sobre Manipulación de datos con Pandas.

Empezaré con una respuesta rápida para los que tengáis prisa, y luego entraré en los detalles.

Respuesta corta: Cómo guardar Pandas DataFrame en CSV

Para guardar un Pandas DataFrame como CSV, utiliza el método DataFrame.to_csv()

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

Sustituye 'your_file_name.csv' por el nombre y la ruta deseados para tu archivo. El argumento index=False impide que Pandas añada una columna índice a tu CSV.

Creación de un DataFrame Pandas

Veamos ahora la respuesta más larga. En lugar de crear un DataFrame desde cero, importaré un conjunto de datos, lo modificaré y guardaré el DataFrame resultante en formato CSV. El primer paso es importar las bibliotecas necesarias:

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

A continuación, podemos importar un conjunto de datos seaborn. El conjunto de datos importado ya es un Pandas Dataframe, por lo que no necesitamos transformarlo.

# We’ll import the 'titanic' dataset from seaborn
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  

Modificar un DataFrame Pandas

Ahora, vamos a realizar algún proceso para obtener un nuevo Marco de Datos. Como mi propósito es explorar elmétodo .to_csv() de Pandas, sólo haré una normalización mín-máx en variables numéricas.

scaler = MinMaxScaler()
# Choose the columns that have integer or float data-types                                           
numerical columns - df.select_dtypes(include=['float64','int64']).columns
new_df = df.copy()
# The min-max scaler will represent all numbers on a 0-to-1 scale
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  

Guardar un DataFrame de Pandas como CSV

Utilizaremos el método DataFrame.to_csv() para guardar el DataFrame modificado como un archivo CSV.

new_df.to_csv('new_titanic.csv') 

Esto guardará el archivo CSV en el directorio actual. Si necesitas un repaso, lee este tutorial sobre cómo obtener el directorio actual en Python.

La forma en que llamé a este método garantizó que todos los parámetros se establecieran en sus valores por defecto. Ahora te presentaré los parámetros y cómo puedes cambiar sus valores según tus necesidades.

Parámetros de DataFrame.to_csv() Explicado

Aquí tienes el mismo método .to_csv() con todos los parámetros:

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'
)

Algunos de estos parámetros son opcionales, como columns, encoding, quoting, lineterminator y storage_options, por lo que sólo establezco valores para ellos, no necesariamente valores por defecto.

El primer parámetro puede ser una cadena, que será el nombre del archivo, o un objeto archivo. Mira este ejemplo:

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

Separadores y valores perdidos

El siguiente parámetro es el separador, que se refiere a cómo se separan los datos. El separador por defecto es la coma, pero podemos cambiarlo por un tabulador o un punto y coma. Un separador de tabulador o punto y coma puede ser útil cuando tus datos exportados deben tener un formato determinado. Además, para los datos que contienen comas, como los textos, utilizar la coma como separador puede provocar cambios no deseados.

Por ejemplo, si tienes "Hola, mundo "como punto de datos, si quieres utilizar el separador coma, también necesitas las comillas para mantenerlo como un único punto de datos. Utilizar en su lugar un tabulador o un separador de punto y coma puede ser la mejor opción, ya que puede ocupar menos memoria que utilizar comas y comillas.

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... 

El tercer parámetro, na_rep, se refiere a la representación de los valores perdidos. Las opciones habituales serían dejar la celda vacía para insertar ‘NaN’ o ‘Na’, pero también puedes insertar tu cadena personalizada. Insertaré ‘Datacamp’ en el siguiente ejemplo por cada valor que falte.

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) 
#find the missing values
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

Manejo de columnas e índices

Veamos cómo se representan los valores perdidos en la columna 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

Si quieres menos decimales, utiliza el parámetro float_format para especificar el número de decimales. Aquí sólo utilizaremos tres.

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

Si no quieres ver el índice, establece el parámetro index en False.

También puedes decidir si conservas los nombres de las columnas, utilizando el parámetro header y fijándolo en True o False, que es la forma de proceder (o puedes fijar los nombres de las columnas).

El parámetro columns te permite seleccionar qué columnas conservar. El parámetro index_label te permite establecer un nombre para el índice de la columna o una lista de nombres si tienes varios índices.

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

Apertura, codificación y compresión de archivos

El parámetro mode te permite decidir qué hacer cuando ya tienes un archivo CSV con el mismo nombre que el que has construido. Si ajustas el parámetro a ‘w’ y ya tienes un archivo new_titanic.csv , el que crees sustituirá al antiguo. Si lo ajustas a ‘x’, el nuevo archivo se crea sólo si no existe ningún archivo con el mismo. Por último, si estableces el parámetro ‘a’, añadirá el nuevo archivo al anterior con el mismo nombre (quizás sólo quieras añadir algunas filas).

El parámetro codificación establece la codificación del nuevo archivo. Si tus datos contienen caracteres especiales, como letras de otros alfabetos, puedes configurarlos en ‘utf-8’ u otra codificación.

El parámetro compression establece la forma en que se comprime el nuevo archivo. Por defecto, está configurado como ‘infer’, lo que significa que comprime el archivo según la extensión especificada, pero también puedes especificar la extensión que prefieras.

# Infer the compression
new_df.to_csv('new_titanic.csv.gz')
# Specify the compression explicitly
new_df.to_csv('new_data.csv.gz', compression='gzip')
# Specify the compression via a dictionary
new_df.to_csv(
    'new_data.zip', 
    compression={
        'method': 'zip', 
        'archive_name': 'data.csv'
    }
)

Cómo utilizar las cotizaciones

El parámetro quoting establece el tipo de datos que se pondrán entre comillas. Como he dicho antes, cuando tienes un separador de comas y también celdas que contienen comas (como los textos), tienes que decidir qué poner entre comillas.

# Default value, quotes only fields with special characters or separators like tabs and commas
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_MINIMAL)
# Quotes all fields
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_ALL)
# Quotes only fields with non-numeric values
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONNUMERIC)
# No field is quoted
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONE)

Datos de tamaño de trozo y fecha-hora

El parámetro chunksize especifica qué parte de tu archivo se escribirá de una vez. Si dejas el valor por defecto, todas las filas se escriben a la vez, pero puedes especificar un número, lo que puede ser útil cuando el archivo es muy grande.

El parámetro date_format establece la representación de los objetos datetime. Puedes especificarlo utilizando elformato strftime .

# Write DataFrame to CSV with dates formatted as 'MM/DD/YYYY'
new_df.to_csv('new_titanic.csv', date_format='%m/%d/%Y')
# You can set datetime objects up to seconds
new_df.to_csv('new_titanic.csv', date_format='%Y-%m-%d %H:%M:%S')

Conclusión

Con un poco de suerte, ¡ahora estarás preparado para exportar tu DataFrame en el formato que mejor se adapte a tus necesidades!

Te animo a que sigas aprendiendo: aquí tienes algunos recursos que puedes probar:

Temas

¡Aprende Pandas con estos cursos!

curso

Data Manipulation with pandas

4 hr
428.1K
Learn how to import and clean data, calculate statistics, and create visualizations with pandas.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

CSV frente a Excel: Elegir bien tus proyectos de datos

Elige CSV para un intercambio de datos sencillo y una alta compatibilidad, y Excel para un análisis completo, visualización y funciones avanzadas.
Samuel Shaibu's photo

Samuel Shaibu

10 min

tutorial

Tutorial de Pandas: DataFrames en Python

Explora el análisis de datos con Python. Los DataFrames de Pandas facilitan la manipulación de tus datos, desde la selección o sustitución de columnas e índices hasta la remodelación de tus datos.
Karlijn Willems's photo

Karlijn Willems

20 min

tutorial

Tutorial pandas read_csv(): importación de datos

La importación de datos es el primer paso importante en cualquier proyecto de ciencia de datos. Aprende por qué los científicos de datos actuales prefieren la función pandas read_csv() para hacerlo.
Kurtis Pykes 's photo

Kurtis Pykes

9 min

tutorial

Tutorial seleccionar columnas con Python

Utiliza Python Pandas y selecciona columnas de los DataFrames. ¡Sigue nuestro tutorial con ejemplos de código y aprende hoy mismo distintas formas de seleccionar tus datos!
DataCamp Team's photo

DataCamp Team

7 min

tutorial

Tutorial de unión de DataFrames en pandas

En este tutorial, usted aprenderá varias maneras en las que múltiples DataFrames pueden ser fusionados en python usando la librería Pandas.
DataCamp Team's photo

DataCamp Team

19 min

Ver másVer más