Curso
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: