DataFrame.where() / Series.where()
Метод where() оставляет значения, удовлетворяющие условию, а остальные заменяет (по умолчанию на NaN). Это «противоположность» mask(): where сохраняет там, где условие истинно. Удобно при фильтрации выбросов или нормализации данных с датчиков.
Сигнатура
DataFrame.where(cond, other=NaN, inplace=False, axis=None, level=None)
Series.where(cond, other=NaN, inplace=False, axis=None, level=None)
Параметры
cond— булева маска (Series/DataFrame/массив/callable) того же размера.other— чем заменять, где условиеFalse. Скаляр,Series,DataFrameили callable.inplace— менять ли исходник.axis— направление выравнивания, еслиcondимеет другую ось.
Возвращаемое значение
Новый объект того же типа (или None при inplace=True).
Примеры
Пример 1. Замена на NaN при невыполнении условия
import pandas as pd
s = pd.Series([10, -5, 20, -1, 30])
print(s.where(s > 0))
0 10.0
1 NaN
2 20.0
3 NaN
4 30.0
dtype: float64
Пример 2. Замена на другое значение
import pandas as pd
s = pd.Series([23, 24, 100, 25, 99])
print(s.where(s < 30, other=0))
0 23
1 24
2 0
3 25
4 0
dtype: int64
Пример 3. Фильтрация выбросов в DataFrame
import pandas as pd
df = pd.DataFrame({
"temp": [23.5, 24.0, 999.0, 23.8],
"hum": [45, 50, 48, 47],
})
clean = df.where(df["temp"] < 100)
print(clean)
temp hum
0 23.5 45.0
1 24.0 50.0
2 NaN NaN
3 23.8 47.0
Пример 4. С другим Series в качестве замены
import pandas as pd
actual = pd.Series([10, 20, 30, 40])
backup = pd.Series([100, 200, 300, 400])
mask = pd.Series([True, False, True, False])
print(actual.where(mask, backup))
0 10
1 200
2 30
3 400
dtype: int64
Пример 5. inplace модификация
import pandas as pd
df = pd.DataFrame({"v": [1, -2, 3, -4]})
df.where(df["v"] > 0, other=0, inplace=True)
print(df)
v
0 1
1 0
2 3
3 0
См. также
Примечание
Лицензия и источники
Техническое описание функции адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Примеры и пояснения — © AlashEd Wiki.