Definir valor para determinada célula em pandas DataFrame usando índice

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
Soluçã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
Comentários (7)

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)

Comentários (8)

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:

Comentários (1)