iloc - Pandas de Python: llene un marco de datos fila por fila
pandas select columns (4)
Esta es una versión más simple
df = DataFrame(columns=(''col1'', ''col2'', ''col3''))
for i in range(5):
df.loc[i] = [''<some value for first>'',''<some value for second>'',''<some value for third>'']`
La simple tarea de agregar una fila a un objeto pandas.DataFrame
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 trato 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, intentó 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 ?
Mi enfoque fue, pero no puedo garantizar que esta sea la solución más rápida.
df = pd.DataFrame(columns=["firstname", "lastname"])
df = df.append({
"firstname": "John",
"lastname": "Johny"
}, ignore_index=True)
Si sus filas de entrada son listas en lugar de diccionarios, la siguiente es una solución simple:
import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])
pd.DataFrame(list_of_lists, columns=[''A'', ''B'', ''C''])
# A B C
# 0 1 2 3
# 1 4 5 6
df[''y'']
establecerá una columna
ya que quiere establecer una fila, use .loc
Tenga en cuenta que .ix
es equivalente aquí, el suyo falló porque intentó asignar un diccionario a cada elemento de la fila y
probablemente no es lo que quiere; la conversión a una serie le dice a los pandas que desea alinear la entrada (por ejemplo, no es necesario que especifique todos los elementos)
In [7]: df = pandas.DataFrame(columns=[''a'',''b'',''c'',''d''], index=[''x'',''y'',''z''])
In [8]: df.loc[''y''] = pandas.Series({''a'':1, ''b'':5, ''c'':2, ''d'':3})
In [9]: df
Out[9]:
a b c d
x NaN NaN NaN NaN
y 1 5 2 3
z NaN NaN NaN NaN