Фильтрация в Pandas

Фильтрация — это выбор строк, удовлетворяющих какому-то условию. В Pandas это делается через «маски» — массивы True/False той же длины, что и DataFrame. Эти маски можно комбинировать через & (и), | (или), ~ (не).

Когда использовать

  • Отсев аномалий — «убрать выбросы > 3σ».

  • Разделение датасета на классы (норма/перегрев).

  • Выборка событий за период времени.

Пример 1. Простое условие

import pandas as pd

df = pd.DataFrame({"sensor": ["A", "B", "C", "D"],
                   "temp":   [22, 35, 19, 41]})
print(df[df["temp"] > 30])

Output:

  sensor  temp
1      B    35
3      D    41

Пример 2. Два условия (AND)

import pandas as pd

df = pd.DataFrame({"sensor": ["A", "B", "C", "D"],
                   "temp":   [22, 35, 19, 41],
                   "hum":    [55, 60, 80, 30]})
m = (df["temp"] > 30) & (df["hum"] < 50)
print(df[m])

Output:

  sensor  temp  hum
3      D    41   30

Каждое условие в скобках — иначе порядок операций сломает логику.

Пример 3. OR

import pandas as pd

df = pd.DataFrame({"temp": [10, 35, 22, 41]})
m = (df["temp"] < 15) | (df["temp"] > 40)
print(df[m])

Output:

   temp
0    10
3    41

Пример 4. between

import pandas as pd

df = pd.DataFrame({"temp": [10, 22, 35, 41]})
print(df[df["temp"].between(20, 40)])

Output:

   temp
1    22
2    35

По умолчанию обе границы включены.

Пример 5. isin

import pandas as pd

df = pd.DataFrame({"device": ["bot1", "bot2", "bot3"], "v": [1, 2, 3]})
print(df[df["device"].isin(["bot1", "bot3"])])

Output:

  device  v
0   bot1  1
2   bot3  3

Пример 6. Инверсия маски

import pandas as pd

df = pd.DataFrame({"device": ["bot1", "bot2", "bot3"]})
print(df[~df["device"].isin(["bot2"])])

Output:

  device
0   bot1
2   bot3

Пример 7. query

import pandas as pd

df = pd.DataFrame({"temp": [22, 35, 41], "hum": [55, 60, 30]})
print(df.query("temp > 30 and hum < 50"))

Output:

   temp  hum
2    41   30

Подводные камни

  • Использовать and/or напрямую между Series нельзя — только &/|.

  • Не забудьте скобки вокруг каждого условия: df["a"] > 1 & df["b"] < 2 будет вычислено неправильно.

  • NaN всегда «выпадает» из фильтра — это бывает неожиданно. Очищайте через Пропуски (NaN) в Pandas.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.