Me gustaría leer varios archivos csv de un directorio en pandas y concatenarlos en un gran DataFrame. Sin embargo, 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 ciclo for ???
dfs
lista, no desea reemplazar la líneadata = pd.read_csv(filename)
condfs.append(pd.read_csv(filename)
. Entonces necesitarías recorrer la lista yconcat
, no creoconcat
que funcione en una lista dedf
s.big_frame = pd.concat(dfs, ignore_index=True)
? De todos modos, una vez que tenga una lista de marcos de datos, deberá iterar sobre la lista y concat abig_frame
dfs
ahora, por lo que algo asífor df in dfs: big_frame.concat(df, ignore_index=True)
debería funcionar, también podría intentarlo enappend
lugar deconcat
también.concat
debería manejar una lista de DataFrames tan bien como lo hiciste. Creo que este es un muy buen enfoque.Respuestas:
Si tiene las mismas columnas en todos sus
csv
archivos, puede probar el siguiente código. He agregadoheader=0
para que después de leer lacsv
primera fila se puedan asignar los nombres de columna.fuente
df = pd.concat((pd.read_csv(f) for f in all_files))
Además, tal vez debería usarse enos.path.join(path, "*.csv")
lugar depath + "/*.csv"
, lo que lo hace independiente del sistema operativo.df['filename'] = os.path.basename(file_)
en el archivo for_ loop ... ¿no está seguro de si la respuesta de Sid lo permite?pandas.read_csv(f).assign(filename = foo)
dentro del generador.assign
devolverá todo el marco de datos, incluida la nueva columnafilename
Una alternativa a la respuesta de darindaCoder :
fuente
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Los soportes internos son requeridos por Pandas versión 0.18.1glob.iglob
lugar deglob.glob
; El primero regresa e iterador (en lugar de una lista) .fuente
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, para evitar lambdasLa biblioteca Dask puede leer un marco de datos de múltiples archivos:
(Fuente: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Los marcos de datos de Dask implementan un subconjunto de la API de marcos de datos de Pandas. Si todos los datos se ajustan a la memoria, puede llamar
df.compute()
para convertir el marco de datos en un marco de datos Pandas.fuente
Casi todas las respuestas aquí son innecesariamente complejas (coincidencia de patrones globales) o dependen de bibliotecas de terceros adicionales. Puede hacer esto en 2 líneas usando todo lo que Pandas y Python (todas las versiones) ya han incorporado.
Para algunos archivos - 1 liner:
Para muchos archivos:
Esta línea de pandas que establece el df utiliza 3 cosas:
pd.read_csv()
) el iterable (nuestra lista), que es cada elemento csv en las rutas de archivo).fuente
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
pero me dio un error "parser_f () falta 1 argumento posicional requerido: 'filepath_or_buffer'"Editar: busqué en Google en https://stackoverflow.com/a/21232849/186078 . Sin embargo, últimamente me parece más rápido hacer cualquier manipulación usando numpy y luego asignarlo una vez al marco de datos en lugar de manipular el marco de datos en sí de forma iterativa y parece funcionar también en esta solución.
Sinceramente, quiero que cualquiera que acceda a esta página considere este enfoque, pero no quiero adjuntar este gran fragmento de código como comentario y hacerlo menos legible.
Puede aprovechar numpy para acelerar realmente la concatenación del marco de datos.
Estadísticas de tiempo:
fuente
Si desea buscar de forma recursiva ( Python 3.5 o superior ), puede hacer lo siguiente:
Tenga en cuenta que las tres últimas líneas se pueden expresar en una sola línea :
Puede encontrar la documentación de
**
aquí . Además, usé eniglob
lugar deglob
, ya que devuelve un iterador en lugar de una lista.EDITAR: Función recursiva multiplataforma:
Puede envolver lo anterior en una función multiplataforma (Linux, Windows, Mac), para que pueda hacer:
Aquí está la función:
fuente
Fácil y rápido
Importe dos o más
csv
sin tener que hacer una lista de nombres.fuente
usando un trazador de líneas
map
, pero si desea especificar argumentos adicionales, puede hacer:Nota:
map
por sí solo no le permite suministrar argumentos adicionales.fuente
Si los múltiples archivos csv están comprimidos, puede usar zipfile para leerlos todos y concatenarlos de la siguiente manera:
fuente
Otro en línea con comprensión de lista que permite utilizar argumentos con read_csv.
fuente
Basado en la buena respuesta de @ Sid.
Antes de concatenar, puede cargar archivos csv en un diccionario intermedio que da acceso a cada conjunto de datos en función del nombre del archivo (en el formulario
dict_of_df['filename.csv']
). Dicho diccionario puede ayudarlo a identificar problemas con formatos de datos heterogéneos, cuando los nombres de columna no están alineados, por ejemplo.Importe módulos y ubique rutas de archivos:
Nota:
OrderedDict
no es necesario, pero mantendrá el orden de los archivos que podrían ser útiles para el análisis.Cargue archivos csv en un diccionario. Luego concatenar:
Las claves son nombres de archivos
f
y los valores son el contenido del marco de datos de los archivos csv. En lugar de usarlof
como una clave de diccionario, también puede usaros.path.basename(f)
u otros métodos os.path para reducir el tamaño de la clave en el diccionario solo a la parte más pequeña que sea relevante.fuente
Alternativa al uso de la
pathlib
biblioteca (a menudo preferida sobreos.path
).Este método evita el uso iterativo de pandas
concat()
/apped()
.De la documentación de pandas:
Vale la pena señalar que concat () (y, por lo tanto, append ()) hace una copia completa de los datos, y que la reutilización constante de esta función puede crear un impacto significativo en el rendimiento. Si necesita usar la operación en varios conjuntos de datos, use una lista de comprensión.
fuente
Así es como puedes hacer usando Colab en Google Drive
fuente
fuente