Сортировка дубликатов и копирование данных

Есть Таблица с данными, есть дубликаты и есть поле 'path' у которого есть None или просто пустое поле Нужно отсортировать по мин.Цене и скопировать 'path' там где его нету

    ID  price     name        path
    0   1   10.0  помидор  jpg1
    1   1   11.0  помидор  jpg1
    2   2   20.0   яблоко        None
    3   2   25.0   яблоко  jpg2
    4   3   25.0    Банан  jpg3
    5   3   30.0    Банан
    6   4   35.0   Персик

результат

    ID  price     name        path
    0   1   10.0  помидор  jpg1
    2   2   20.0   яблоко  jpg2
    4   3   25.0    Банан  jpg3
    6   4   35.0   Персик  noFoto.jpg

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

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

при таком датафрейме:

ID,price,name,path
0,1,10.0,помидор,помидор.jpg
1,1,11.0,помидор,помидор.jpg
2,2,20.0,яблоко,None
3,2,25.0,яблоко,яблоко.jpg
4,3,25.0,Банан,банан.jpg
5,3,30.0,Банан,

попробуйте так:

import numpy as np

df['path'].replace(r'^(?!.*jpg)', np.nan, regex=True, inplace=True)
df = df.sort_values(['ID','path'],na_position='last').fillna(method='ffill')
res = df.sort_values("price").drop_duplicates(subset=["ID"])

res, соответственно, получится:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
2   2   20.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg

UPDATE

на основании новых пожеланий автора вопроса - если в сете есть строки без дубликатов или без путей к картинкам:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
1   1   11.0  помидор  помидор.jpg
2   2   20.0   яблоко         None
3   2   25.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg
5   3   30.0    Банан          NaN
6   4   35.0   Персик          NaN
7   5   45.0   ананас          NaN
8   5   40.0   ананас          NaN

делаем так:

df['path'].replace(r'^(?!.*jpg)', np.nan, regex=True, inplace=True)
df['path'] = df.sort_values(['ID','path'],na_position='last').groupby('name')['path'].fillna(method='ffill')
res = df.sort_values("price").drop_duplicates(subset=["ID"])
res.fillna("<NO_IMAGE>", inplace=True)

получаем res:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
2   2   20.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg
6   4   35.0   Персик   <NO_IMAGE>
8   5   40.0   ананас   <NO_IMAGE>
→ Ссылка