Ik'heb een Pandas DataFrame gemaakt
df = DataFrame(index=['A','B','C'], columns=['x','y'])
en kreeg dit
x y A NaN NaN B NaN NaN C NaN NaN
x y A NaN NaN B NaN NaN C 10 NaN
met deze code:
df.xs('C')['x'] = 10
maar inhoud van df
is'niet veranderd. Het is weer alleen NaN
in DataFrame.
Iemand suggesties?
Het antwoord van RukTech's, df.set_value('C', 'x', 10)
, is veel en veel sneller dan de opties die ik'hieronder heb voorgesteld. Het is echter slated for deprecation.
Voortaan is de aanbevolen methode .iat/.at
.
Waarom df.xs('C')['x']=10
niet werkt:
df.xs('C')
geeft standaard een nieuw dataframe met een kopie van de gegevens, dus
df.xs('C')['x']=10
wijzigt alleen dit nieuwe dataframe.
df['x']
geeft een weergave van het df
dataframe, dus
df['x']['C'] = 10
wijzigt df
zelf.
Waarschuwing: Het is soms moeilijk te voorspellen of een bewerking een kopie of een view retourneert. Om deze reden raden de docs aan om opdrachten met "chained indexing" te vermijden.
Dus het aanbevolen alternatief is
df.at['C', 'x'] = 10
die df
wel wijzigt.
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
Update: De .set_value
methode gaat deprecated worden. .iat/.at
zijn goede vervangers, helaas biedt pandas weinig documentatie
De snelste manier om dit te doen is met behulp van set_value. Deze methode is ~100 keer sneller dan de .ix
methode. Bijvoorbeeld:
df.set_value('C', 'x', 10)
De aanbevolen manier (volgens de beheerders) om een waarde in te stellen is:
df.ix['x','C']=10
Het gebruik van 'chained indexing' (df['x']['C']
) kan tot problemen leiden.
Zie: