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
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?
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
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)
.
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: