Метод where
Метод where применяется к DataFrame
и возвращает объект того же размера, где элементы,
не удовлетворяющие условию, заменяются на другое значение.
Первым параметром передаётся условие, вторым - значение,
которым будут заменены элементы, для которых условие ложно.
Если второй параметр не указан, используется NaN.
Метод работает аналогично функции np.where, но сохраняет
индексы и структуру исходного DataFrame.
Синтаксис
df.where(cond, other=nan, inplace=False, axis=None, level=None)
Основные параметры:
-
cond- условие (булев массив, вызываемая функция илиSeries), по которому проверяются значения -
other- значение для замены (по умолчаниюNaN) -
inplace- еслиTrue, изменяет исходный объект -
axis- ось для применения условия (0 - строки, 1 - столбцы) -
level- уровень для многомерных индексов
Пример
Давайте заменим все значения меньше 3 на 0:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [10, 20, 30, 40, 50]
})
res = df.where(df >= 3, 0)
print(res)
Результат выполнения кода:
a b
0 0 10
1 0 20
2 3 30
3 4 40
4 5 50
В первом столбце значения 1 и 2 заменены на 0,
так как они меньше 3. Второй столбец не изменился,
поскольку все его значения удовлетворяют условию.
Пример
Если не указать второе значение, заменяться будет на NaN:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [10, 20, 30, 40, 50]
})
res = df.where(df % 2 == 0)
print(res)
Результат выполнения кода:
a b
0 NaN 10.0
1 2.0 20.0
2 NaN NaN
3 4.0 40.0
4 NaN NaN
Чётные числа остались без изменений, а все нечётные
заменены на NaN.
Пример
Метод where можно применять с функцией в качестве условия:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [10, 20, 30, 40, 50]
})
res = df.where(lambda x: x > x.mean(), -999)
print(res)
Результат выполнения кода:
a b
0 -999 10.0
1 -999 20.0
2 -999 30.0
3 4.0 40.0
4 5.0 50.0
Значения, превышающие среднее по столбцу, остались,
остальные заменены на -999.
Пример
Используем параметр axis для применения условия по строкам:
import pandas as pd
df = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': [10, 20, 30, 40, 50]
})
res = df.where(df > df.mean(axis=1), 0, axis=0)
print(res)
Результат выполнения кода:
a b
0 0 10
1 0 20
2 0 30
3 0 40
4 0 50
Здесь условие проверялось построчно: значения,
не превышающие среднее по строке, заменены на 0.