¿Buena alternativa al método Pandas .append(), ahora que está en desuso?

6 minutos de lectura

Avatar de usuario de Glenn
glenn

Uso mucho el siguiente método para agregar una sola fila a un marco de datos. Una cosa que realmente me gusta es que te permite agregar un objeto de dictado simple. Por ejemplo:

# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])

# Appending a row
df = df.append({ 'a': 1, 'b': 2 }, ignore_index=True)

Nuevamente, lo que más me gusta de esto es que el código es muy limpio y requiere muy pocas líneas. Ahora supongo que la alternativa recomendada es:

# Create the new row as its own dataframe
df_new_row = pd.DataFrame({ 'a': [1], 'b': [2] })
df = pd.concat([df, df_new_row])

Entonces, lo que antes era una línea de código ahora son dos líneas con una variable descartable y un cruft adicional donde creo el nuevo marco de datos. 🙁 ¿Hay una buena manera de hacer esto que solo use un dict como el que tengo en el pasado (que no está en desuso)?

  • número de pandas 35407 explica que df.append quedó en desuso porque: “Series.append y DataFrame.append [are] haciendo una analogía con list.append, pero es una mala analogía ya que el comportamiento no está (y no puede estar) en su lugar. Los datos para el índice y los valores deben copiarse para crear el resultado”.

    –Paul Rougieux

    10 de febrero a las 12:15

  • Encontré esta advertencia hoy. Sin embargo, cuando usé concat como alternativa, obtuve “no se puede concatenar el objeto de tipo ‘‘; solo los objs Series y DataFrame son válidos”. Muy frustrante…..

    – Ben Watson

    13 de febrero a las 23:16

Cree una lista con sus diccionarios, si son necesarios, y luego cree un nuevo marco de datos con df = pd.DataFrame.from_records(your_list). El método “agregar” de List es muy eficiente y nunca quedará obsoleto. Los marcos de datos, por otro lado, con frecuencia tienen que ser recreados y todos los datos copiados en anexos, debido a su diseño, es por eso que desaprobaron el método.

  • ¿Cómo sabes que está en desuso? A pandas.pydata.org/docs/reference/api/… (que actualmente muestra la versión 1.4.0) No veo ninguna mención al respecto. Incluso en el árbol de desarrollo no veo ninguna advertencia de desaprobación: pandas.pydata.org/docs/dev/reference/api/…

    – zby

    2 feb a las 10:55

  • Estoy de acuerdo ; aunque cuando usa el método de agregar (con 1.4.0) se encuentra con una “Advertencia futura: el método frame.append está obsoleto y se eliminará de pandas en una versión futura. Use pandas.concat en su lugar”. Encontrarás los detalles en el página “Novedades”

    – tgrandje

    4 de febrero a las 13:20


  • @zby la actualización de la documentación se trata en esta solicitud de extracción: github.com/pandas-dev/pandas/pull/45587

    –Paul Rougieux

    10 de febrero a las 12:21

  • esto trajo una velocidad diez veces más rápida a mi código, muchas gracias hombre

    – kush

    7 de mayo a las 13:37

  • Esa es en realidad la razón por la que están desaprobando df.append. Gracias a los mantenedores de Pandas por eso. Aún así, la “nueva forma de hacerlo” debería ser más prominente en sus documentos, seguro.

    – jsbueno

    7 de mayo a las 16:50

Avatar de usuario de Rafael Gaitán
Rafael Gaitán

También me gusta el método append. Pero puedes hacerlo en una línea con una lista de dictados

df = pd.concat([df, pd.DataFrame.from_records([{ 'a': 1, 'b': 2 }])])

o usando loc y tuplas para valores en DataFrames con índices ascendentes incrementales

df.loc[len(df), ['a','b']] = 1, 2

o tal vez

df.loc[len(df), df.columns] = 3, 4

  • También puedes usar ignore_index df = pd.concat([df, pd.DataFrame.from_records([{ 'a': 1, 'b': 2 }])], ignore_index=True)

    – Rafael Gaitán

    22 abr a las 18:50

avatar de usuario de beltalowda
beltalowda

Si quieres usar concat en cambio:

append

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

concat

outputxlsx = pd.concat([outputxlsx, df])

  • outputxlsx = pd.concat([outputxlsx, df]) es suficiente desde df es un marco de datos.

    –Paul Rougieux

    14 de junio a las 19:09


Avatar de usuario de Nico
Nico

Estaba enfrentando un problema similar. Las otras soluciones realmente no funcionaban para mí. Dejo esta respuesta aquí como una posibilidad adicional para tratar el problema, ya que este es el primer resultado de Google para ciertas búsquedas y yo mismo terminé aquí al menos por segunda vez.

En mi caso, los datos no son un dictado, sino solo una lista de valores para un conjunto conocido de parámetros. Quiero agregar los valores de los parámetros a un marco de datos como filas porque de esta manera puedo acceder a una serie de todos los valores de un parámetro a través de df[parameter].

Comienzo con un DataFrame vacío:

parameters = ['a', 'b', 'c', 'd', 'e', 'f']
df = pd.DataFrame(columns=parameters)

d.f.:

        a   b   c   d   e   f

Con agregar podría agregar filas muy convenientes así:

new_row = pd.Series([1,2,3,4,5,6], index=parameters, name="row1")
df.append(new_row)

d.f.:

        a   b   c   d   e   f
row1    1   2   3   4   5   6

Con pd.concat encontré esto para entregar el mismo resultado de una manera muy similar:

new_row = pd.DataFrame([1,2,3,4,5,6], columns=['row1'], index=parameters).T
df = pd.concat((df, new_row))

La clave fue crear un marco de datos (1, n) a partir de los datos 1d y luego transponerlo para que coincida con el otro marco de datos.

Para aquellos, como yo, que quieren una función descriptiva en lugar de muchas frases ingeniosas, aquí hay una opción basada en @Rafael Gaitan arriba.

def appendDictToDF(df,dictToAppend):
  df = pd.concat([df, pd.DataFrame.from_records([dictToAppend])])
  return df

# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])

# Appending a row
df= appendDictToDF(df,{ 'a': 1, 'b': 2 })

Avatar de usuario de Sambasivam Pathmaraj Mani
Sambasivam Pathmaraj Mani

# Deprecated issue has been resolved

# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])
print("df columns:", df)

# Appending a row
df = df.append({ 'a': 1, 'b': 2 }, ignore_index=True)
print("df column Values :", df)

# Create the new row as its own dataframe
df_new_row = pd.DataFrame.from_records({ 'a': [3], 'b': [4] })
df = pd.concat([df, df_new_row])
print("pd concat with two df's :", df)

Avatar de usuario de J4E
J4E

yo tambien tengo el problema al usar DataFrame.append en mi programa antes, pero se ha solucionado ahora. Esperemos que este fragmento pueda ayudar.

import pandas as pd
df1=pd.DataFrame(dict_1)

def addData(param1,param2,param3):
    dict_2={"list1":var1, "list2":var2, "list3":var3}
    df2=pdDataFrame(dict_2, index={len(dict_2)+1})
    dfc=pd.concat([df1, df2])
    return dfc

  • Por favor, no se limite a publicar el código de su propio problema sin explicar cómo aborda la pregunta formulada. Está utilizando tres variables diferentes, que no define ni explica, y no muestra cuál es su entrada y cuál es el resultado de su código. Sus nombres de variables y nombres de parámetros de funciones también son diferentes. Consulte cómo responder para obtener información sobre cómo escribir buenas respuestas.

    – AlexK

    24 de junio a las 21:19


¿Ha sido útil esta solución?