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)