Сортировка дубликатов и копирование данных
Есть Таблица с данными, есть дубликаты и есть поле '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>