pandas минимальное значение с условием

К датафрейму добавляется колонка с минимальным значением по каждому товару только из колонок, которые имеются для этого товара в словаре. Как добавить условие при расчёте мин. - если значение в отбираемых колонках больше значений в колонке 'Кол_7'?

import pandas as pd
slov={'Товар1':['Кол_1','Кол_3','Кол_6'],
'Товар2':['Кол_2','Кол_4','Кол_6','Кол_8']
        }
df=pd.DataFrame({
            'Кол_0':['Товар1','Товар2'],
            'Кол_1':[20,25],
            'Кол_2':[89,15],
            'Кол_3':[36,30],
            'Кол_4':[40,108],
            'Кол_5':[55,2],
            'Кол_6':[35,38],
            'Кол_7':[30,20]
            })
df['min']=df.apply(lambda r:r[[col for col in slov.get(r['Кол_0'], []) if col in r]].min(),axis=1)

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

Автор решения: Алексей Р

Небольшая модификация вашего кода путем добавления отбора .loc[lambda x: x > r['Кол_7']]:

df['min'] = df.apply(lambda r: r[[col for col in slov.get(r['Кол_0'], []) if col in r]].loc[lambda x: x > r['Кол_7']].min(), axis=1)
    Кол_0  Кол_1  Кол_2  Кол_3  Кол_4  Кол_5  Кол_6  Кол_7  min
0  Товар1     20     89     36     40     55     35     30   35
1  Товар2     25     15     30    108      2     38     20   38

И вариант немного покороче с использованием пересечения множеств для фильтрации по колонкам вместо спискового включения:

df['min'] = df.apply(lambda r: r[list({*r.index} & {*slov[r['Кол_0']]})].loc[lambda x: x > r['Кол_7']].min(), axis=1)

.idxmax() с None - получилось довольно громоздкое выражение:

df['min'] = df.apply(lambda r: y.idxmin() if not (y := r[list({*r.index} & {*slov[r['Кол_0']]})].loc[lambda x: x > r['Кол_7'] * 1.2]).empty else None, axis=1)
→ Ссылка