Как в столбце найти индекс ближайшего сверху противоположного значения от текущего
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 шт):
Зачем вы вообще используете 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