es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Guardando múltiples archivos csv a partir de un archivo csv dividido en fragmentos en pandas

Estoy tratando de cargar un archivo csv muy grande (~25 millones de filas) en pandas. Estoy dividiendo este archivo, de 100,000 filas cada vez, y agregando un nuevo dataframe que básicamente cuenta las ocurrencias de ciertas palabras dentro de una columna del dataframe dividido. Cuando guardo el primer fragmento, todo funciona correctamente y el fragmento se concatena al nuevo dataframe creado al lado. Sin embargo, el segundo fragmento se concatena en diagonal por alguna razón. Por esto quiero decir que el dataframe dividido ahora tiene 200,000 filas, con las primeras 100,000 filas vacías, y el nuevo dataframe creado se concatena al lado de las primeras 100,000 filas. ¿Cómo soluciono este problema y concateno cada fragmento al lado del nuevo dataframe creado y guardo cada fragmento en archivos csv separados?

Mi código:

import pandas as pd
from pandas.core.frame import DataFrame

chunk = 1

for df in pd.read_csv('all_comments_data.csv', chunksize=100000):
    dict_to_append = {}

with open('conflict_words.txt') as f:
    for word in f.readlines():
        dict_to_append[word.strip()] = []

index = 0

for comment in df['comment'].to_numpy():
    word_list = str(comment).split(" ")
    for conflict_word in dict_to_append.keys():
        dict_to_append[conflict_word].append(word_list.count(conflict_word))
    print(index)
    index +=1

df_to_append = pd.DataFrame(dict_to_append)
final_df = pd.concat([pd.DataFrame(df), df_to_append], axis=1)
final_df.to_csv(f"all_comments_data_with_conflict_scores_{chunk}.csv")
chunk += 1 

Lo que necesito es que los dataframes se vean así:

| chunk | new_dframe |

Lo que los dataframes parecen después del primer fragmento:

| | new_dframe |
| chunk | |

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema que estás enfrentando se debe a la forma en que estás concatenando los dataframes usando pd.concat(). La parte pd.DataFrame(df) está creando un dataframe vacío con los mismos nombres de columna que el dataframe original, pero con un índice diferente. Al concatenarlos, Pandas alinea las columnas basándose en sus etiquetas, por lo que está alineando el dataframe vacío con el dataframe recién creado y creando filas vacías para rellenar los valores faltantes.

    Para solucionar este problema, debes usar df.copy() en lugar de pd.DataFrame(df) para crear una copia del dataframe original con los mismos índices y luego concatenar los dos dataframes. Además, para guardar cada trozo en un archivo CSV separado, debes cambiar el nombre del archivo en cada iteración.

    Aquí está el código actualizado:

    import pandas as pd
    
    chunk = 1
    
    for df in pd.read_csv('all_comments_data.csv', chunksize=100000):
        dict_to_append = {}
    
        with open('conflict_words.txt') as f:
            for word in f.readlines():
                dict_to_append[word.strip()] = []
    
        index = 0
    
        for comment in df['comment'].to_numpy():
            word_list = str(comment).split(" ")
            for conflict_word in dict_to_append.keys():
                dict_to_append[conflict_word].append(word_list.count(conflict_word))
            print(index)
            index += 1
    
        df_to_append = pd.DataFrame(dict_to_append)
        final_df = pd.concat([df.copy(), df_to_append], axis=1)
        final_df.to_csv(f"all_comments_data_with_conflict_scores_{chunk}.csv")
        chunk += 1 
    

    Este código debería concatenar los dataframes uno al lado del otro y guardar cada trozo en archivos CSV separados.

Comments are closed.