Как в столбце найти индекс ближайшего сверху противоположного значения от текущего

import pandas as pd
import numpy as np

df=pd.DataFrame.from_dict({'Color':['black','black','white','white']},orient='index').transpose()
df['serch_index']=np.nan

Для первого значения 'white' ближайшее противоположное второе значение 'black', как и для 2 значения 'white' ближайшее противоположное второе значение 'black', нужно вернуть индекс второго значения 'black' для ячейки первого значения 'white' и второго значения 'white'.

Алгоритм действия следующий: 1) цикл по столбцу 2) скан текущего значения и его индекс 3) вычитание из индекса текущего значения со всеми значениями индексами противоположных значений 4) нахождение минимального значения разницы из 3). 5) Запись результата по адресу текущего значения

Из задачи нахождения ближайшего сверху индекса думаю можно использовать параметр iloc[:value]

Код и псевдокод:

df['serch_index']=[
                   for x in df.loc[df.iloc[:item.index,0],'Color']
                       if bool(re.match(r'black', x.values))==True #3) действие
                               min([item.index-x.index])         #4) действие
                   
                   if bool(re.match(r'white', item.values))==True #2)действие 
                   else 
                        for y in df.loc[df.iloc[:item.index,0],'Color']
                             if bool(re.match(r'white', y.values))==True  #3)действие
                                  min([item.index-y.index])             #4) действие
                   
                   for item in df['Color'] #1)действие
                   ] #5 действие

print(df['serch_index'])

Как правильно организовать алгоритм псевдо кода; например: item.values, item.index, x.index,min()


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

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

Зачем вы вообще используете pandas, если не используете её функционал? Использование циклов в pandas - это практически преступление и явный признак того, что нет полного понимания, как работают векторизованные функции этой библиотеки.

import pandas as pd

df=pd.DataFrame({'Color':['black','black','white','white']})

df = df.assign(search_index = df.loc[df.loc[:,"Color"]=="white"]
               .apply(lambda x: max([y for y in df[df.loc[:,"Color"]=="black"].index if y < x.name]), axis=1))
print(df)
   Color  search_index
0  black           NaN
1  black           NaN
2  white           1.0
3  white           1.0
→ Ссылка