A tarefa simples de adicionar uma linha a um pandas.DataFrame
objeto 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 ?
loc
atributo do quadro de dados define um especial__setitem__
que faz a mágica que eu suponho.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
funcionar?Minha abordagem foi, mas não posso garantir que esta seja a solução mais rápida.
fonte
append
os dados no quadro de dados.Esta é uma versão mais simples
fonte
Se suas linhas de entrada são listas e não dicionários, a seguir é uma solução simples:
fonte