python pandas как лучше отфильтровать данные dataframe до первого найденного значения

Рейтинг: 0Ответов: 2Опубликовано: 10.08.2023
import pandas as pd

# assign data
df_new = pd.DataFrame({'value_1': [4, 1, 7, 2, 3, 0, 10, 1, 9],
                       'value_2': [6, 5, 4, 6, 7, 3, 5, 2, 3]})

print(df_new)

# фильтруем данные по колонке 'value_2'
dFilter = df_new[df_new.value_2 > 4]
dFilter

Задача: как отфильтровать/получить данные только до первого значения не подходящего под условия фильтра без использования циклов, а только используя pandas/numpy ?

пример какие надо данные

Ответы

▲ 3Принят

Можно через группировку:

import pandas as pd

df_new = pd.DataFrame({'value_1': [4, 1, 7, 2, 3, 0, 10, 1, 9],
                       'value_2': [6, 5, 4, 6, 7, 3, 5, 2, 3]})
res = df_new.groupby((df_new["value_2"]==4).cumsum()).get_group(0)

res:

   value_1  value_2
0        4        6
1        1        5

Либо через локатор и индекс:

res = df.iloc[:df.index[df_new["value_2"]==4][0]]

Либо через локатор и numpy.where, например:

import numpy as np
res = df.iloc[:np.where(df_new["value_2"]==4)[0][0]]
▲ 2

Делаем булев массив, где для допустимых значений будет False (условие <=4), суммируем с накоплением и оставляем только те строки, где сумма меньше 1 - т.е. первые допустимые значения остаются во фрейме.

df_new = df_new[df_new.value_2.le(4).cumsum().lt(1)]
   value_1  value_2
0        4        6
1        1        5