137 votos

añadir una fila en un pandas.DataFrame

Entiendo que pandas está diseñado para cargar DataFrame completamente poblado pero necesito crear un DataFrame vacío y luego añadir filas, una por una . ¿Cuál es la mejor manera de hacerlo?

He creado con éxito un DataFrame vacío con :

res = DataFrame(columns=('lib', 'qty1', 'qty2'))

Entonces puedo añadir una nueva fila y rellenar un campo con :

res = res.set_value(len(res), 'qty1', 10.0)

Funciona pero parece muy extraño :-/ (falla al añadir el valor de la cadena)

¿Cómo puedo añadir una nueva fila a mi DataFrame (con diferentes tipos de columnas)?

96voto

NPE Puntos 169956

Puede utilizar pandas.concat() o DataFrame.append() . Para más detalles y ejemplos, consulte Fusionar, unir y concatenar .

71voto

ShikharDua Puntos 356

Podrías crear una lista de diccionario. Donde cada diccionario corresponde a una fila. Estas filas se añaden a la lista principal en un bucle for. Una vez que la lista está completa, a continuación, crear un marco de datos. Este es un enfoque mucho más rápido.

Tengo un problema similar en el que si creaba un marco de datos para cada fila y lo añadía al marco de datos principal tardaba 30 minutos. Por otro lado, si se utiliza la metodología anterior, tuve éxito en cuestión de segundos.

rows_list = []
for row in rows:

        dict1 = {}
        ##Blah Blah .... 
        dict1.update(blah..) 
        rows_list.append(dict1)

df = pd.DataFrame(rows_list)

59voto

fred Puntos 142

Ejemplo en la respuesta de @Nasser:

>df = DataFrame(columns=('lib', 'qty1', 'qty2'))
   for i in range(5):
     df.loc[i] = [randint(-1,1) for n in range(3)]

>print(df)
    lib  qty1  qty2
0    0     0    -1
1   -1    -1     1
2    1    -1     1
3    0     0     0
4    1    -1    -1

[5 rows x 3 columns]

22voto

FooBar Puntos 1529

Si conoce el número de entradas ex ante, debería preasignar el espacio proporcionando también el índice (tomando el ejemplo de los datos de otra respuesta):

import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )

# now fill it up row by row
for x in np.arange(0, numberOfRows):
    #loc or iloc both work here since the index is natural numbers
    df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]: 
   lib  qty1  qty2
0   -1    -1    -1
1    0     0     0
2   -1     0    -1
3    0    -1     0
4   -1     0     0

Comparación de la velocidad

In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop

13voto

Nasser Al-Wohaibi Puntos 578

Para una anexión eficaz, véase Cómo añadir una fila extra a un dataframe de pandas y Ajuste con la ampliación .

Añadir filas a través de loc en datos de índices no existentes.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X