Как написать цикл, который отдает значения после определенных условий?

Как написать правильный цикл для вывода значений после определенный значений?

    color   object  object2 price
0   red     hybk    htgn     0.9
1   blue    ball    oil      1.2
2   red     trfk    tiran    0.9
3   yellow  pen     pig      1.0
4   green   pencil  tron     0.6
5   yellow  q1       q2      0.9
6   red     f3      f3       1.7
7   white   troll   hel      0.9
8   yellow  fly     dog      1.7
9   red     urik    tiran    0.9
10  yellow  tol     sky      1.7
11  blue    urok    hat      0.9
  1. В df есть три строки с color yellow
  2. Нужно написать цикл, который ищет значения с yellow, и если после yellow идет red, то складывает этот red в отдельный df
  3. Результат должен быть таким:
    color   object  object2 price
4   red     f3      f3       1.7
9   red     urik    tiran    0.9

  1. Мне нужно отобрать только те red, которые идут сразу после yellow.

Ответы (2 шт):

Автор решения: MaxU

а зачем здесь цикл:

idx_first = df["color"].shift().eq("yellow").idxmax()

res = df.loc[idx_first:].query("color != 'yellow'")

для ценителей "прекрасного" - можно превратить это в трудночитаемый однострочник:

res = df.loc[df["color"].shift().eq("yellow").idxmax():].query("color != 'yellow'")

результат:

In [193]: res
Out[193]:
   color  object object2  price
2  green  pencil    tron    0.6
4    red      f3      f3    1.7
5  white   troll     hel    0.9
7   blue    urik   tiran    0.9

→ Ссылка
Автор решения: MaxU

Общий подход в таких случаях создать виртуальный или же постоянный столбец со значениями из предыдущей строки и дальше делать проверки в рамках одной строки:

In [198]: df.assign(prev_color=df["color"].shift())
Out[198]:
     color  object object2  price prev_color
0      red    hybk    htgn    0.9        NaN
1     blue    ball     oil    1.2        red
2      red    trfk   tiran    0.9       blue
3   yellow     pen     pig    1.0        red
4    green  pencil    tron    0.6     yellow
5   yellow      q1      q2    0.9      green
6      red      f3      f3    1.7     yellow
7    white   troll     hel    0.9        red
8   yellow     fly     dog    1.7      white
9      red    urik   tiran    0.9     yellow
10  yellow     tol     sky    1.7        red
11    blue    urok     hat    0.9     yellow

In [199]: df.assign(prev_color=df["color"].shift()).query("prev_color=='yellow' and color=='red'")
Out[199]:
  color object object2  price prev_color
6   red     f3      f3    1.7     yellow
9   red   urik   tiran    0.9     yellow

думаю вы сами справитесь с тем, чтобы пройти циклом по получившемуся фрейму...

→ Ссылка