Importe varios archivos CSV a pandas y concatenelos en un DataFrame

Resuelto jonas asked hace 10 años • 20 respuestas

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 ?

jonas avatar Jan 03 '14 22:01 jonas
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.
  • pathlibPara 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 usandoenumerate
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.repeatpara 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 .assignpara 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)
Gaurav Singh avatar Jan 20 '2014 11:01 Gaurav Singh

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
Sid avatar Apr 05 '2016 02:04 Sid