Código:

i = 0
while i<3:
    def avoid_repeat_df():
        rows = []
        for i in range(1):
            try:
                rows. append([i, i + 2])
                df = pd. DataFrame(rows, columns=["Aaa", "Bee"])
                df.to_csv('example.csv')#mode='a' write the ouput same as df else only last occurance
                print(df)  
            except:
                pass  
    avoid_repeat_df()        
    i+=1    

Imprime la salida como

 Aaa  Bee
0    0    2
   Aaa  Bee
0    0    2
   Aaa  Bee
0    0    2

Pero en csv solo se escribe la última línea (en el modo de adición, lo mismo que df genera toda la línea)

Lo que espero: evitar repetir el encabezado de columna

 Aaa  Bee
0    0    2
0    0    2  
0    0    2

Espero haberlo explicado en detalles. Gracias por tu tiempo y ayuda.

0
Ohm Dios 13 jul. 2021 a las 11:21

3 respuestas

La mejor respuesta

Intente definir la variable de filas (lista) fuera del ciclo while:

i = 0
rows = []
while i<3:
    def avoid_repeat_df():
        for i in range(1):
            try:
                rows. append([i, i + 2])
                df = pd. DataFrame(rows, columns=["Aaa", "Bee"])
                df.to_csv('example.csv')#mode='a' write the ouput same as df else only last occurance
                print(df)  
            except:
                pass  
    avoid_repeat_df()        
    i+=1 

Ahora, si marca example.csv:

,Aaa,Bee
0,0,2
1,0,2
2,0,2
1
Anurag Dabas 13 jul. 2021 a las 08:32

Prueba esto:

i = 0
rows = []
while i<3:
    l = [[k, k + 2] for k in range(1)]
    rows.extend(l)
    i+=1
df = pd.DataFrame(rows,columns=["Aaa", "Bee"])
df.to_csv("example.csv")
print(df)

Salida

   Aaa  Bee
0    0    2
1    0    2
2    0    2
1
Rishin Rahim 13 jul. 2021 a las 08:38

Veo 2 formas de manejar esto, una como la menciona @Anurag Dabas, para mover la definición del marco de datos fuera del ciclo. Puedo ayudarte con el segundo, en el que mientras escribes, simplemente puedes usar la opción header en el método to_csv.

Mientras usa mode='a', use header=False, esto omitirá escribir el encabezado de la columna cada vez.

Pero de acuerdo con lo que se presenta, la mejor manera sería usar la lista en lugar de crear un marco de datos, ya que es computacionalmente ineficiente.

i = 0
rows = list()
while i<3:
    def avoid_repeat_df():
        global rows
        for i in range(1):
            try:
                rows.append([i, i + 2])
            except:
                pass  
    avoid_repeat_df()        
    i+=1
df = pd. DataFrame(rows, columns=["Aaa", "Bee"])
df.to_csv('example.csv')
print(df)  

Si aún desea crear df solamente

i = 0
while i<3:
    def avoid_repeat_df():
        rows = list()
        for i in range(1):
            try:
                rows.append([i, i + 2])
                df = pd.DataFrame(rows, columns=["Aaa", "Bee"])
                if os.path("example.csv").exists():
                   df.to_csv("example.csv", mode="a", header=False)
                else:
                   df.to_csv("example.csv")
                # This won't change actual df though
                print(df)
            except:
                pass  
    avoid_repeat_df()        
    i+=1  

También puede agregar a df y guardar cuando se hayan completado todas sus iteraciones, pero eso sería tan bueno como crear una lista y luego crear un marco de datos a partir de ella.

0
Sajal 13 jul. 2021 a las 08:52