Ho creato un DataFrame Pandas
df = DataFrame(index=['A','B','C'], columns=['x','y'])
e ho ottenuto questo pre> x y A NaN NaN B NaN NaN C NaN NaN pre> br> Poi voglio assegnare un valore a una cella particolare, per esempio per la riga 'C' e la colonna 'x'. Mi aspettavo di ottenere tale risultato: pre> x y A NaN NaN B NaN NaN C 10 NaN pre>
con questo codice:
df.xs('C')['x'] = 10
ma il contenuto di df
non è cambiato. È di nuovo solo NaN
s in DataFrame.
Qualche suggerimento?
[La risposta di RukTech (https://stackoverflow.com/a/24517695/190597), df.set_value('C', 'x', 10)
, è di gran lunga più veloce delle opzioni che ho suggerito di seguito. Tuttavia, è stato slated for deprecation.
In futuro, il metodo raccomandato è .iat/.at
.
Perché df.xs('C')['x']=10
non funziona:
df.xs('C')
per default, restituisce un nuovo dataframe con una copia dei dati, quindi
df.xs('C')['x']=10
modifica solo questo nuovo dataframe.
df['x']
restituisce una vista del dataframe df
, quindi
df['x']['C'] = 10
modifica df
stesso.
Attenzione: A volte è difficile prevedere se un'operazione restituisce una copia o una vista. Per questo motivo i docs raccomandano di evitare assegnazioni con "indicizzazione concatenata".
Quindi l'alternativa raccomandata è
df.at['C', 'x'] = 10
che modifica il 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
Il modo raccomandato (secondo i manutentori) per impostare un valore è:
df.ix['x','C']=10
Usare 'indicizzazione concatenata' (df['x']['C']
) può portare a problemi.
Vedere: