A tarefa simples de adicionar uma linha a um pandas.DataFrameobjeto parece ser difícil de realizar. Existem três perguntas sobre o stackoverflow relacionadas a isso, nenhuma das quais fornece uma resposta útil.
Aqui está o que estou tentando fazer. Eu tenho um DataFrame do qual eu já conheço a forma e os nomes das linhas e colunas.
>>> 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
Agora, tenho uma função para calcular os valores das linhas iterativamente. Como posso preencher uma das linhas com um dicionário ou um pandas.Series? Aqui estão várias tentativas que falharam:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Aparentemente, ele tentou adicionar uma coluna em vez de uma linha.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Mensagem de erro muito pouco informativa.
>>> 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, isso é apenas para definir valores individuais no quadro de dados.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Bem, eu não quero ignorar o índice, caso contrário, aqui está o 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
Alinhou os nomes das colunas com os valores, mas perdeu os rótulos das linhas.
>>> 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
Isso também falhou miseravelmente.
Então como você faz isso ?
locatributo do quadro de dados define um especial__setitem__que faz a mágica que eu suponho.