Vytvoril som Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
a dostal som toto
x y A NaN NaN B NaN NaN C NaN NaN
x y A NaN NaN B NaN NaN C 10 NaN
s týmto kódom:
df.xs('C')['x'] = 10
ale obsah df
sa nezmenil. V DataFrame je opäť len NaN
.
Nejaké návrhy?
RukTech's answer, df.set_value('C', 'x', 10)
, je oveľa rýchlejší ako možnosti, ktoré som navrhol nižšie. Bola však zrušená.
Do budúcnosti sa odporúča metóda .iat/.at
.
Prečo df.xs('C')['x']=10
nefunguje:
df.xs('C')
štandardne vracia nový dátový rámec s kópiou údajov, takže
df.xs('C')['x']=10
modifikuje iba tento nový dátový rámec.
df['x']
vráti pohľad na dátový rámec df
, takže
df['x']['C'] = 10
modifikuje samotný df
.
Upozornenie: Niekedy je ťažké predpovedať, či operácia vráti kópiu alebo pohľad. Z tohto dôvodu dokumenty odporúčajú vyhnúť sa priradeniam s "reťazovým indexovaním".
Takže odporúčaná alternatíva je
df.at['C', 'x'] = 10
ktorý zmenil 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
Odporúčaný spôsob (podľa správcov) nastavenia hodnoty je:
df.ix['x','C']=10
Použitie 'reťazového indexovania' (df['x']['C']
) môže viesť k problémom.
Pozri: