Stel waarde in voor bepaalde cel in pandas DataFrame met behulp van index

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

Dan wil ik waarde toekennen aan bepaalde cel, bijvoorbeeld voor rij 'C' en kolom 'x'. Ik'heb verwacht een dergelijk resultaat te krijgen:
    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?

Oplossing

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
Commentaren (7)

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)

Commentaren (8)

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:

Commentaren (1)