Ustaw wartość dla konkretnej komórki w pandas DataFrame używając indeksu

I've utworzył Pandas DataFrame

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

i dostałem to

    x y
A NaN NaN
B NaN NaN
C NaN NaN

Następnie chcę przypisać wartość do konkretnej komórki, np. dla wiersza 'C' i kolumny 'x'. Spodziewałem się uzyskać taki wynik:
    x y
A NaN NaN
B NaN NaN
C 10 NaN

z tym kodem:

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

ale zawartość df nie uległa zmianie. To znowu tylko NaN w DataFrame.

Jakieś sugestie?

Rozwiązanie

Odpowiedź RukTecha, df.set_value('C', 'x', 10), jest o wiele szybsza niż opcje, które zaproponowałem poniżej. Jednakże, został on został zlikwidowany.

Idąc dalej, zalecaną metodą jest .iat/.at.


Dlaczego df.xs('C')['x']=10 nie działa:?

df.xs('C') domyślnie zwraca nową ramkę danych z kopią danych, więc

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

modyfikuje tylko tę nową ramkę danych.

df['x'] zwraca widok ramki danych df, więc

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

modyfikuje samą df.

Ostrzeżenie: Czasami trudno jest przewidzieć, czy operacja zwraca kopię czy widok. Z tego powodu docs zalecają unikanie przypisań z "indeksowaniem łańcuchowym".


Tak więc zalecaną alternatywą jest

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

który dokładnie modyfikuje 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
Komentarze (7)

Aktualizacja: Metoda .set_value będzie zdeprecjonowana. .iat/.at są dobrymi zamiennikami, niestety pandas dostarcza mało dokumentacji


Najszybszym sposobem na zrobienie tego jest użycie set_value. Ta metoda jest ~100 razy szybsza niż metoda .ix. Na przykład:

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

Komentarze (8)

Zalecanym sposobem (według opiekunów) na ustawienie wartości jest:

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

Użycie 'chained indexing' (df['x']['C']) może prowadzić do problemów.

Zobacz:

Komentarze (1)