Combinación de archivos .csv en Python - Error de datos de archivos combinados - Jupyter Lab
Estoy intentando combinar una gran cantidad de archivos .csv. Todos tienen el mismo formato de tabla, con 60 columnas cada uno. Mi tabla combinada da como resultado que los datos salgan bien, excepto que la primera fila consta de 640 columnas en lugar de 60 columnas. El resto del .csv combinado consta del formato de 60 columnas deseado. No estoy seguro de en qué parte del proceso de fusión salió mal.
El primer elemento de la fila problemática es el primer elemento de 20140308.export.CSV mientras que el segundo (que comienza en la columna 61) es el primer elemento de 20140313.export.CSV. El primer archivo .csv es 20140301.export.CSV, el último es 20140331.export.CSV (AAAAMMDD.export.csv), para un total de 31 archivos .csv. Esto significa que la fila problemática consta del primer elemento de diferentes archivos .csv.
Los datos provienen de http://data.gdeltproject.org/events/index.html. En particular, las fechas del 1 de marzo al 31 de marzo de 2014. La inspección de la descarga de cada archivo .csv individual muestra que cada archivo tiene el mismo formato, con delimitadores de tabulación y valores separados por comas.
El código que utilicé está a continuación. Si hay algo más que pueda publicar, hágamelo saber. Todo esto se ejecutó a través de Jupyter Lab a través de Google Cloud Platform. Gracias por la ayuda.
import glob
import pandas as pd
file_extension = '.export.CSV'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
combined_csv_data = pd.concat([pd.read_csv(f, delimiter='\t', encoding='UTF-8', low_memory= False) for f in all_filenames])
combined_csv_data.to_csv('2014DataCombinedMarch.csv')
Usé el siguiente código bash para descargar los datos:
!curl -LO http://data.gdeltproject.org/events/[20140301-20140331].export.CSV.zip
Usé el siguiente código para descomprimir los datos:
!unzip -a "********".export.CSV.zip
Usé el siguiente código para transferir a mi depósito de almacenamiento:
!gsutil cp 2014DataCombinedMarch.csv gs://ddeltdatabucket/2014DataCombinedMarch.csv
Respuestas
Parece que estos archivos CSV no tienen encabezado, por lo que Pandas está tratando de usar la primera fila del archivo como encabezado. Luego, cuando Pandas intenta concat () los marcos de datos juntos, está tratando de hacer coincidir los nombres de columna que ha inferido para cada archivo.
Descubrí cómo suprimir ese comportamiento:
import glob
import pandas as pd
def read_file(f):
names = [f"col_{i}" for i in range(58)]
return pd.read_csv(f, delimiter='\t', encoding='UTF-8', low_memory=False, names=names)
file_extension = '.export.CSV'
all_filenames = [i for i in glob.glob(f"*{file_extension}")]
combined_csv_data = pd.concat([read_file(f) for f in all_filenames])
combined_csv_data.to_csv('2014DataCombinedMarch.csv')
Puede proporcionar sus propios nombres de columna a Pandas a través del namesparámetro. Aquí, sólo estoy suministrando col_0, col_1, col_2, etc para los nombres, porque no sé lo que deberían ser. Si sabe cuáles deberían ser esas columnas, debería cambiar esa names = línea.
Probé este script, pero solo con 2 archivos de datos como entrada, no los 31.
PD: ¿Ha considerado utilizar Google BigQuery para obtener los datos? He trabajado con GDELT antes a través de esa interfaz y es mucho más fácil.