I'criei uma Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
e consegui isto
x y Um NaN NaN B NaN NaN C NaN NaN Depois quero atribuir valor a uma célula específica, por exemplo para linha 'C' e coluna 'x'. I'esperava obter tal resultado:x y Um NaN NaN B NaN NaN C 10 NaN com este código:df.xs('C')['x'] = 10
mas o conteúdo do
df
haven't mudou. It's novamente apenasNaN
s em DataFrame.Alguma sugestão?
RukTech's answer, df.set_value('C', 'x', 10)
, está longe e longe mais rápido do que as opções I've sugeridas abaixo. Entretanto, foi slated for deprecation.
Seguindo adiante, o método recomendado é `.iat/.at'.
Porquê df.xs('C')['x']=10
não funciona:
df.xs('C')
por padrão, retorna um novo dataframe com uma cópia dos dados, então
df.xs('C')['x']=10
modifica apenas este novo quadro de dados.
df['x']
retorna uma visão do quadro de dados df
, portanto
df['x']['C'] = 10
modifica o próprio df
.
**Aviso***: Por vezes é difícil prever se uma operação devolve uma cópia ou uma vista. Por esta razão os docs recomendam evitar atribuições com "indexação em cadeia".
Portanto, a alternativa recomendada é
df.at['C', 'x'] = 10
que faz modificar df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
Atualização: O método .set_value' vai ser [depreciado][2].
.iat/.at` são bons substitutos, infelizmente pandas fornece pouca documentação
A maneira mais rápida de fazer isso é usando set_value. Este método é ~100 vezes mais rápido do que o método `.ix'. Por exemplo:
df.set_value('C'C', 'x', 10)
A forma recomendada (de acordo com os mantenedores) para definir um valor é:
df.ix['x','C']=10
Utilizando 'chained indexing' (df['x']['C']
) pode levar a problemas.
Veja: