Entiendo que los pandas están diseñados para cargar completamente poblados, DataFrame
pero necesito crear un DataFrame vacío y luego agregar filas, una por una . Cuál es la mejor manera de hacer esto ?
Creé con éxito un DataFrame vacío con:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Luego puedo agregar una nueva fila y llenar un campo con:
res = res.set_value(len(res), 'qty1', 10.0)
Funciona pero parece muy extraño: - / (falla al agregar valor de cadena)
¿Cómo puedo agregar una nueva fila a mi DataFrame (con diferentes tipos de columnas)?
Respuestas:
Puede usar
df.loc[i]
, donde la fila con índicei
será lo que especifique para que esté en el marco de datos.fuente
.loc
hace referencia a la columna de índice, por lo que si está trabajando con un DataFrame preexistente con un índice que no es una secuencia continua de enteros que comienza con 0 (como en su ejemplo),.loc
sobrescribirá las filas existentes, o insertará filas, o crea lagunas en tu índice. Un enfoque más robusto (pero no infalible) para agregar un marco de datos existente de longitud distinta de cero sería:df.loc[df.index.max() + 1] = [randint(...
o prepoblar el índice como sugirió @FooBar.df.index.max()
esnan
cuando el DataFrame está vacío.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
En caso de que pueda obtener todos los datos para el marco de datos por adelantado, hay un enfoque mucho más rápido que agregar un marco de datos:
Tuve una tarea similar para la cual agregar un marco de datos fila por fila tomó 30 minutos, y crear un marco de datos a partir de una lista de diccionarios completada en segundos.
fuente
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Podrías usar
pandas.concat()
oDataFrame.append()
. Para obtener detalles y ejemplos, consulte Combinar, unir y concatenar .fuente
.loc
mecanismo que se puede evitar, especialmente si tienes cuidado.DataFrame.append()
, debe asegurarse de que sus datos de fila también sean un DataFrame en primer lugar, no una lista.Ha pasado mucho tiempo, pero también enfrenté el mismo problema. Y encontré aquí muchas respuestas interesantes. Entonces estaba confundido qué método usar.
En el caso de agregar muchas filas al marco de datos, me interesa el rendimiento de la velocidad . Así que probé los 4 métodos más populares y verifiqué su velocidad.
ACTUALIZADO EN 2019 utilizando nuevas versiones de paquetes. También actualizado después del comentario de @FooBar
RENDIMIENTO DE VELOCIDAD
Resultados (en segundos):
También gracias a @krassowski por sus útiles comentarios. Actualicé el código.
Entonces uso la suma a través del diccionario para mí.
Código:
PD: Creo que mi realización no es perfecta, y tal vez hay algo de optimización.
fuente
df2.index.max()
for.loc
innecesariamente aumenta la complejidad computacional. Simpledf2.loc[i] = ...
haría. Para mí, redujo el tiempo de 10s a 8.64sSi conoce el número de entradas ex ante, debe preasignar el espacio proporcionando también el índice (tomando el ejemplo de datos de una respuesta diferente):
Comparación de velocidad
Y, a partir de los comentarios, con un tamaño de 6000, la diferencia de velocidad se vuelve aún mayor:
fuente
fuente
Para un agregado eficiente, vea Cómo agregar una fila adicional a un marco de datos de pandas y Configuración con ampliación .
Agregue filas a través
loc/ix
de datos de índice clave no existentes . p.ej :O:
fuente
Puede agregar una sola fila como diccionario utilizando la
ignore_index
opciónfuente
f.append(<stuff>)
crea un nuevo objeto, en lugar de simplemente agregar al objeto actual en su lugar, por lo que si está tratando de agregar a un marco de datos en un script, debe decirf = f.append(<stuff>)
Por el bien de Pythonic, aquí agregue mi respuesta:
fuente
También puede crear una lista de listas y convertirla en un marco de datos:
dando
fuente
Esta no es una respuesta a la pregunta de OP sino un ejemplo de juguete para ilustrar la respuesta de @ShikharDua, que he encontrado muy útil.
Si bien este fragmento es trivial, en los datos reales tenía miles de filas y muchas columnas, y deseaba poder agrupar por diferentes columnas y luego realizar las estadísticas a continuación para más de una columna de taget. Por lo tanto, tener un método confiable para construir el marco de datos una fila a la vez fue una gran conveniencia. ¡Gracias @ShikharDua!
fuente
Descubrí una manera simple y agradable:
fuente
Puede usar el objeto generador para crear un Marco de datos, que será más eficiente en la memoria en la lista.
Para agregar datos en bruto al DataFrame existente, puede usar el método append.
fuente
Cree un nuevo registro (marco de datos) y agréguelo a old_data_frame .
pasar la lista de valores y los nombres de columna correspondientes para crear un nuevo registro (marco_de_datos)
fuente
Aquí está la forma de agregar / agregar una fila en
pandas DataFrame
Se puede usar para insertar / anexar una fila en pandas vacíos o poblados DataFrame
fuente
En lugar de una lista de diccionarios como en la respuesta de ShikharDua, también podemos representar nuestra tabla como un diccionario de listas , donde cada lista almacena una columna en orden de fila, dado que conocemos nuestras columnas de antemano. Al final construimos nuestro DataFrame una vez.
Para c columnas y n filas, esto usa 1 diccionario y c listas, versus 1 lista y n diccionarios. El método de la lista de diccionarios tiene cada diccionario almacenando todas las claves y requiere crear un nuevo diccionario para cada fila. Aquí solo agregamos listas, que es tiempo constante y teóricamente muy rápido.
fuente
si desea agregar una fila al final, agréguela como una lista
fuente
Otra forma de hacerlo (probablemente no muy eficiente):
También puede mejorar la clase DataFrame de esta manera:
fuente
Todo lo que necesitas es
loc[df.shape[0]]
oloc[len(df)]
o
fuente
Hazlo simple. Al tomar la lista como entrada que se agregará como fila en el marco de datos: -
fuente
A menudo vemos la construcción
df.loc[subscript] = …
para asignar a una fila de DataFrame. Mikhail_Sam publicó puntos de referencia que contienen, entre otros, esta construcción, así como el método que usa dict y crear DataFrame al final . Encontró que este último era el más rápido con diferencia. Pero si reemplazamos eldf3.loc[i] = …
(con DataFrame preasignado) en su código condf3.values[i] = …
, el resultado cambia significativamente, ya que ese método funciona de manera similar al que usa dict. Por lo tanto, debemos tener más en cuenta el uso dedf.values[subscript] = …
. Sin embargo, tenga en cuenta que.values
toma un subíndice basado en cero, que puede ser diferente del DataFrame.index.fuente
# .loc with prealloc
), otro ejemplo está en la pregunta que tengo que comparar los datos de cada fila de un Pandas DataFrame con los datos del resto de las filas, ¿hay alguna manera de acelerar el cálculo? ? y su respuesta aceptada.pandas.DataFrame.append
DataFrame.append (self, other, ignore_index = False, verificar_integrity = False, sort = False) → 'DataFrame'
Con ignore_index establecido en True:
fuente
antes de agregar una fila, tenemos que convertir el marco de datos al diccionario, allí puede ver las claves como columnas en el marco de datos y los valores de las columnas se almacenan nuevamente en el diccionario, pero la clave para cada columna es el número de índice en el marco de datos. Esa idea me hace escribir el siguiente código.
fuente
Puede concatenar dos DataFrames para esto. Básicamente me encontré con este problema para agregar una nueva fila a un DataFrame existente con un índice de caracteres (no numérico). Entonces, ingreso los datos para una nueva fila en un ducto () y el índice en una lista.
fuente
Esto se encargará de agregar un elemento a un DataFrame vacío. El problema es que
df.index.max() == nan
para el primer índice:fuente