Mam DataFrame i chcę zamienić wartości w określonej kolumnie, które przekraczają wartość zerem. Myślałem, że jest to sposób na osiągnięcie tego:
df[df.my_channel > 20000].my_channel = 0
Jeśli skopiuję kanał do nowej ramki danych, to proste:
df2 = df.my_channel
df2[df2 > 20000] = 0
Robi dokładnie to, czego chcę, ale wydaje się, że nie działa z kanałem jako częścią oryginalnej ramki DataFrame.
Odpowiedzi:
.ix
indeksator działa dobrze dla pand w wersji wcześniejszej niż 0.20.0, ale od pandy 0.20.0.ix
indeksator jest przestarzały , więc należy go unikać. Zamiast tego możesz użyć indeksatorów.loc
lubiloc
. Możesz rozwiązać ten problem poprzez:Lub w jednej linii
mask
pomaga wybrać wiersze, w którychdf.my_channel > 20000
jestTrue
, podczas gdydf.loc[mask, column_name] = 0
ustawia wartość 0 na wybrane wiersze, w których znajdują sięmask
blokady w kolumnie o nazwiecolumn_name
.Aktualizacja: w tym przypadku należy użyć,
loc
ponieważ jeśli go użyjesziloc
, otrzymaszNotImplementedError
informację, że indeksowanie boolowskie oparte na iLocation na typie całkowitym nie jest dostępne .źródło
Próbować
Uwaga: Ponieważ v0.20.0,
ix
została zaniechana na korzyśćloc
/iloc
.źródło
np.where
funkcja działa w następujący sposób:W twoim przypadku chciałbyś:
źródło
Powodem, dla którego oryginalna ramka danych nie jest aktualizowana, jest to, że indeksowanie łańcuchowe może spowodować zmodyfikowanie kopii zamiast widoku ramki danych. W docs dać tej rady:
Masz kilka alternatyw: -
loc
+ Indeksowanie logiczneloc
może służyć do ustawiania wartości i obsługuje maski boolowskie:mask
+ Indeksowanie logiczneDo swojej serii możesz przypisać:
Możesz też zaktualizować swoją serię na miejscu:
np.where
+ Indeksowanie logicznePaństwo może używać NumPy przypisując swój oryginalnej serii, gdy warunek nie spełnione; jednak pierwsze dwa rozwiązania są bardziej przejrzyste, ponieważ jawnie zmieniają tylko określone wartości.
źródło
Użyłbym
lambda
funkcji naSeries
takiejDataFrame
jak ta:Nie twierdzę, że jest to skuteczny sposób, ale działa dobrze.
źródło
loc
tutaj użyćdf.loc[: , 'my_column'] = df['my_column'].map(f)
. Nie wiem, czy jest szybki jak te, które dodałeś poniżej.Spróbuj tego:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
lub
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
źródło