¿Agregar una lista o serie a un DataFrame de pandas como una fila?

Respuestas:

132

A veces es más fácil hacer todos los anexos fuera de los pandas, luego, simplemente cree el DataFrame de una sola vez.

>>> import pandas as pd
>>> simple_list=[['a','b']]
>>> simple_list.append(['e','f'])
>>> df=pd.DataFrame(simple_list,columns=['col1','col2'])
   col1 col2
0    a    b
1    e    f
Mike Chirico
fuente
22
Mala práctica para nombrar una variable list. Acaba de sobrescribir el listconstructor.
Jason Strimpel
1
La pregunta parece implicar que no todas las filas se conocen de antemano.
DISC-O
103
df = pd.DataFrame(columns=list("ABC"))
df.loc[len(df)] = [1,2,3]
Ashot Matevosyan
fuente
8
Este es el más fácil si desea agregar al final del df.
Sid
2
Esto es exactamente lo que quería, ¡tan simple pero efectivo!
MSalty
3
¿Por qué esta no es la respuesta seleccionada?
Lucas Azevedo
Esto generalmente está bien, pero solo funciona si tiene un índice que aumenta monótonamente que comienza en 0.
dreab
59

Aquí hay una solución simple y tonta:

>>> import pandas as pd
>>> df = pd.DataFrame()
>>> df = df.append({'foo':1, 'bar':2}, ignore_index=True)
Jaidev Deshpande
fuente
25
Tenga en cuenta que esto es agregar un dictado, no una lista
anthnyprschka
36

¿Podrías hacer algo como esto?

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['col1', 'col2'])
>>> df = df.append(pd.Series(['a', 'b'], index=['col1','col2']), ignore_index=True)
>>> df = df.append(pd.Series(['d', 'e'], index=['col1','col2']), ignore_index=True) 
>>> df
  col1 col2
0    a    b
1    d    e

¿Alguien tiene una solución más elegante?

Alex Woolford
fuente
1
Aquí hay una solución más simple y tonta: `` `importar pandas como pd df = pd.DataFrame () df = df.append ({'foo': 1, 'bar': 2}, ignore_index = True) # Tenga en cuenta que este anexo no sucede en su lugar. ``
Jaidev Deshpande
27

Siguiendo la respuesta de Mike Chirico ... si desea agregar una lista después de que el marco de datos ya esté poblado ...

>>> list = [['f','g']]
>>> df = df.append(pd.DataFrame(list, columns=['col1','col2']),ignore_index=True)
>>> df
  col1 col2
0    a    b
1    d    e
2    f    g
Jay Marm
fuente
¿Crea una copia? ¿Es posible agregar in situ?
lucid_dreamer
4

Si desea agregar una Serie y usar el índice de la Serie como columnas del DataFrame, solo necesita agregar la Serie entre corchetes:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame()

In [3]: row=pd.Series([1,2,3],["A","B","C"])

In [4]: row
Out[4]: 
A    1
B    2
C    3
dtype: int64

In [5]: df.append([row],ignore_index=True)
Out[5]: 
   A  B  C
0  1  2  3

[1 rows x 3 columns]

Sin el ignore_index=True, no obtiene el índice adecuado.

bmello
fuente
4

Aquí hay una función que, dado un marco de datos ya creado, agregará una lista como una nueva fila. Esto probablemente debería incluir captadores de errores, pero si sabe exactamente lo que está agregando, entonces no debería ser un problema.

import pandas as pd
import numpy as np

def addRow(df,ls):
    """
    Given a dataframe and a list, append the list as a new row to the dataframe.

    :param df: <DataFrame> The original dataframe
    :param ls: <list> The new row to be added
    :return: <DataFrame> The dataframe with the newly appended row
    """

    numEl = len(ls)

    newRow = pd.DataFrame(np.array(ls).reshape(1,numEl), columns = list(df.columns))

    df = df.append(newRow, ignore_index=True)

    return df
jadki
fuente
3

La conversión de la lista a un marco de datos dentro de la función de agregar funciona, también cuando se aplica en un bucle

import pandas as pd
mylist = [1,2,3]
df = pd.DataFrame()
df = df.append(pd.DataFrame(data[mylist]))
Janfelix
fuente
2

simplemente usa loc:

>>> df
     A  B  C
one  1  2  3
>>> df.loc["two"] = [4,5,6]
>>> df
     A  B  C
one  1  2  3
two  4  5  6
Qinsi
fuente
0

La forma más sencilla:

my_list = [1,2,3,4,5]
df['new_column'] = pd.Series(my_list).values

Editar:

No olvide que la longitud de la nueva lista debe ser la misma que la del marco de datos correspondiente.

Ghanem
fuente