Indstil værdien for en bestemt celle i pandas DataFrame ved hjælp af indeks

Jeg har oprettet et Pandas DataFrame

df = DataFrame(index=['A','B','C'], columns=['x','y'])

og fik dette

    x y
A NaN NaN NaN
B NaN NaN NaN
C NaN NaN NaN

Derefter vil jeg tildele værdi til en bestemt celle, f.eks. for række 'C' og kolonne 'x'. Jeg'har forventet at få et sådant resultat:
    x y
A NaN NaN NaN
B NaN NaN NaN
C 10 NaN

med denne kode:

df.xs('C')['x'] = 10

men indholdet af df er ikke ændret. Det er igen kun NaNs i DataFrame.

Nogen forslag?

Løsning

RukTech's svar, df.set_value('C', 'x', 10), er langt hurtigere end de muligheder, jeg har foreslået nedenfor. Den er dog blevet [slated for deprecation] (https://github.com/pandas-dev/pandas/issues/15269).

Fremover er den [anbefalede metode .iat/.at] (https://github.com/pandas-dev/pandas/issues/15269#issuecomment-276382712).


Hvorfor df.xs('C')['x']=10 ikke virker:

df.xs('C') returnerer som standard et nyt dataframe med en kopi af dataene, så

df.xs('C')['x']=10

kun ændrer dette nye dataframe.

df['x'] returnerer en visning af df datarammen, så

df['x']['C'] = 10

ændrer df selv.

Varsling: Det er nogle gange svært at forudsige, om en operation returnerer en kopi eller en visning. Af denne grund anbefaler docs at undgå opgaver med "chained indexing"1.


Så det anbefalede alternativ er

df.at['C', 'x'] = 10

som gør ændring af 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
Kommentarer (7)

Opdatering: Metoden .set_value vil blive forældet. .iat/.at er gode erstatninger, desværre giver pandas kun lidt dokumentation


Den hurtigste måde at gøre dette på er at bruge set_value. Denne metode er ~100 gange hurtigere end .ix-metoden. For eksempel:

fdf.set_value('C', 'x', 10)`

Kommentarer (8)

Den anbefalede måde (ifølge vedligeholderne) at indstille en værdi på er:

df.ix['x','C']=10

Brug af 'chained indexing'; (df['x']['C']) kan føre til problemer.

Se:

Kommentarer (1)