Nastavitev vrednosti za določeno celico v pandas DataFrame z uporabo indeksa

Ustvaril sem podatkovni okvir Pandas DataFrame

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

in dobil sem tole

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

Nato želim pripisati vrednost določeni celici, na primer vrstici 'C' in stolpcu 'x'. Pričakoval sem, da bom dobil takšen rezultat:
    x y
A NaN NaN
B NaN NaN NaN
C 10 NaN

s to kodo:

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

vendar se vsebina df ni spremenila. V DataFrame je spet samo NaN.

Kakršen koli predlog?

Rešitev

RukTechov odgovor, df.set_value('C', 'x', 10), je veliko hitrejši od možnosti, ki sem jih predlagal spodaj. Vendar pa je bila izločena iz uporabe.

V prihodnje je priporočena metoda .iat/.at.


Kaj df.xs('C')['x']=10 ne deluje:

df.xs('C') privzeto vrne nov podatkovni okvir s kopijo podatkov, zato

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

spremeni samo ta novi podatkovni okvir.

df['x'] vrne pogled na podatkovni okvir df, torej

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

spreminja samo df.

Pozorilo: Včasih je težko predvideti, ali operacija vrne kopijo ali pogled. Zato dokumenti priporočajo, da se izogibate nalogam z "verižnim indeksiranjem".


Zato je priporočena alternativa

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

ki spreminja 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
Komentarji (7)

Posodobitev: Metoda .set_value bo zastarela. .iat/.at sta dobri zamenjavi, na žalost pa pandas ponuja malo dokumentacije


Najhitrejši način za to je uporaba set_value. Ta metoda je ~100-krat hitrejša od metode .ix. Na primer:

df.set_value('C', 'x', 10)

Komentarji (8)

Priporočeni način (po mnenju vzdrževalcev) za nastavitev vrednosti je:

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

Uporaba 'verižnega indeksiranja' (df['x']['C']) lahko povzroči težave.

Glej:

Komentarji (1)