Как написать цикл, который отдает значения после определенных условий?
Как написать правильный цикл для вывода значений после определенный значений?
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
- В
dfесть три строки сcoloryellow - Нужно написать цикл, который ищет значения с
yellow, и если послеyellowидетred, то складывает этотredв отдельныйdf - Результат должен быть таким:
color object object2 price
4 red f3 f3 1.7
9 red urik tiran 0.9
- Мне нужно отобрать только те
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
думаю вы сами справитесь с тем, чтобы пройти циклом по получившемуся фрейму...