Leyendo múltiples archivos CSV en el dataframe de Python Pandas

El caso de uso general detrás de la pregunta es leer varios archivos de registro CSV de un directorio de destino en un solo DataFrame de Python Pandas para un rápido análisis estadístico y gráficos. La idea de utilizar Pandas vs MySQL es llevar a cabo esta importación de datos o agregar análisis estadísticos periódicamente a lo largo del día.

La siguiente secuencia de comandos intenta leer todos los archivos CSV (mismo diseño de archivo) en un único dataframe de Pandas y agrega una columna de año asociada con cada archivo leído.

El problema con el script es que ahora solo lee el último archivo en el directorio en lugar de que el resultado deseado sea todos los archivos dentro del directorio seleccionado.

# Assemble all of the data files into a single DataFrame & add a year field # 2010 is the last available year years = range(1880, 2011) for year in years: path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year frame = pd.read_csv(path, names=columns) frame['year'] = year pieces.append(frame) # Concatenates everything into a single Dataframe names = pd.concat(pieces, ignore_index=True) # Expected row total should be 1690784 names  Int64Index: 33838 entries, 0 to 33837 Data columns: name 33838 non-null values sex 33838 non-null values births 33838 non-null values year 33838 non-null values dtypes: int64(2), object(2) # Start aggregating the data at the year & gender level using groupby or pivot total_births = names.pivot_table('births', rows='year', cols='sex', aggfunc=sum) # Prints pivot table total_births.tail() Out[35]: sex FM year 2010 1759010 1898382 

El método de append en una instancia de un DataFrame no funciona igual que el método de append en una instancia de una lista. Dataframe.append() no se produce en el lugar y en su lugar devuelve un nuevo objeto.

 years = range(1880, 2011) names = pd.DataFrame() for year in years: path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year frame = pd.read_csv(path, names=columns) frame['year'] = year names = names.append(frame, ignore_index=True) 

o puedes usar concat :

 years = range(1880, 2011) names = pd.DataFrame() for year in years: path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year frame = pd.read_csv(path, names=columns) frame['year'] = year names = pd.concat(names, frame, ignore_index=True) 

No pude conseguir que ninguna de las respuestas anteriores funcionara. La primera respuesta fue cerrada, pero el espacio de la línea entre la segunda y la tercera línea después de for no era correcto. Utilicé el siguiente fragmento de código en Canopy. Además, para aquellos que estén interesados ​​… este problema provino de un ejemplo en “Python para análisis de datos” . (Un libro agradable de lo contrario)

 import pandas as pd years = range(1880,2011) columns = ['name','sex','births'] names = pd.DataFrame() for year in years: path = 'C:/PythonData/pydata-book-master/pydata-book-master/ch02/names/yob%d.txt' % year frame = pd.read_csv(path, names=columns) frame['year'] = year names = names.append(frame,ignore_index=True) 

eliminar el espacio de línea entre:

  frame = pd.read_csv(path, names=columns) 

Y

  frame['year'] = year 

por lo que se lee

  for year in years: path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year frame = pd.read_csv(path, names=columns) frame['year'] = year names = pd.append(names, frame, ignore_index=True)