Importe varios archivos CSV a pandas y concatenelos en un DataFrame
Me gustaría leer varios archivos CSV de un directorio en pandas y concatenarlos en un gran DataFrame. Aunque no he podido resolverlo. Esto es lo que tengo hasta ahora:
import glob
import pandas as pd
# Get data file names
path = r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
¿Supongo que necesito ayuda dentro del bucle for ?
Aceptado
Consulte pandas: herramientas IO para conocer todos los .read_
métodos disponibles.
Pruebe el siguiente código si todos los archivos CSV tienen las mismas columnas.
He agregado header=0
, para que después de leer la primera fila del archivo CSV, se pueda asignar como nombre de columna.
import pandas as pd
import glob
import os
path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(os.path.join(path , "/*.csv"))
li = []
for filename in all_files:
df = pd.read_csv(filename, index_col=None, header=0)
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True)
O, con atribución a un comentario de Sid .
all_files = glob.glob(os.path.join(path, "*.csv"))
df = pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
- A menudo es necesario identificar cada muestra de datos, lo que se puede lograr agregando una nueva columna al marco de datos.
pathlib
Para este ejemplo se utilizará la biblioteca estándar. Trata las rutas como objetos con métodos, en lugar de cadenas para dividir.
Importaciones y configuración
from pathlib import Path
import pandas as pd
import numpy as np
path = r'C:\DRO\DCL_rawdata_files' # or unix / linux / mac path
# Get the files from the path provided in the OP
files = Path(path).glob('*.csv') # .rglob to get subdirectories
Opción 1:
- Agregue una nueva columna con el nombre del archivo.
dfs = list()
for f in files:
data = pd.read_csv(f)
# .stem is method for pathlib objects to get the filename w/o the extension
data['file'] = f.stem
dfs.append(data)
df = pd.concat(dfs, ignore_index=True)
Opcion 2:
- Agregue una nueva columna con un nombre genérico usando
enumerate
dfs = list()
for i, f in enumerate(files):
data = pd.read_csv(f)
data['file'] = f'File {i}'
dfs.append(data)
df = pd.concat(dfs, ignore_index=True)
Opción 3:
- Cree los marcos de datos con una lista de comprensión y luego utilícelos
np.repeat
para agregar una nueva columna.[f'S{i}' for i in range(len(dfs))]
crea una lista de cadenas para nombrar cada marco de datos.[len(df) for df in dfs]
crea una lista de longitudes
- La atribución de esta opción va a esta respuesta de trazado .
# Read the files into dataframes
dfs = [pd.read_csv(f) for f in files]
# Combine the list of dataframes
df = pd.concat(dfs, ignore_index=True)
# Add a new column
df['Source'] = np.repeat([f'S{i}' for i in range(len(dfs))], [len(df) for df in dfs])
Opción 4:
- Una línea utilizada
.assign
para crear la nueva columna, con atribución a un comentario de C8H10N4O2
df = pd.concat((pd.read_csv(f).assign(filename=f.stem) for f in files), ignore_index=True)
o
df = pd.concat((pd.read_csv(f).assign(Source=f'S{i}') for i, f in enumerate(files)), ignore_index=True)
Una alternativa a la respuesta de darindaCoder :
path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(os.path.join(path, "*.csv")) # advisable to use os.path.join as this makes concatenation OS independent
df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df = pd.concat(df_from_each_file, ignore_index=True)
# doesn't create a list, nor does it append to one