¿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

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]

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)

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?


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

¿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.


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

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]))

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.