La simple tarea de agregar una fila a un pandas.DataFrame
objeto parece ser difícil de lograr. Hay 3 preguntas de stackoverflow relacionadas con esto, ninguna de las cuales da una respuesta funcional.
Esto es lo que estoy tratando de hacer. Tengo un DataFrame del que ya conozco la forma, así como los nombres de las filas y columnas.
>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
a b c d
x NaN NaN NaN NaN
y NaN NaN NaN NaN
z NaN NaN NaN NaN
Ahora, tengo una función para calcular los valores de las filas de forma iterativa. ¿Cómo puedo completar una de las filas con un diccionario o un pandas.Series
? Aquí hay varios intentos que han fallado:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Aparentemente trató de agregar una columna en lugar de una fila.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Mensaje de error muy poco informativo.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)
Aparentemente eso es solo para establecer valores individuales en el marco de datos.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Bueno, no quiero ignorar el índice, de lo contrario aquí está el resultado:
>>> df.append(y, ignore_index=True)
a b c d
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 1 5 2 3
Alineó los nombres de las columnas con los valores, pero perdió las etiquetas de las filas.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.ix['y'] = y
>>> df
a b \
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
c d
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
Eso también falló miserablemente.
Entonces, cómo lo haces ?
loc
atributo del marco de datos define un especial__setitem__
que hace la magia, supongo.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
trabajo?Mi enfoque fue, pero no puedo garantizar que esta sea la solución más rápida.
fuente
append
los datos en el marco de datos.Esta es una versión más simple.
fuente
Si sus filas de entrada son listas en lugar de diccionarios, la siguiente es una solución simple:
fuente