#pandas #string #loops #dictionary #apply
#pandas #строка #циклы #словарь #применить
Вопрос:
Фреймы данных df1, df2, где столбец имени df1 имеет строку, частично совпадающую со значением столбца имени df2. При частичном совпадении значений столбцов name затем сравните значение столбца price обоих фреймов данных и, если это одна и та же цена, обновите столбец (флаг) в df1 как «Удалить»
df1
Имя | Цена | Отметить |
---|---|---|
VENTILLA HOME FARR | 662324.21 | Удалить |
VENTILLA HOME FARR | -277961.62 | |
VENTILLA HOME FARR | 776011.5 | |
VARAMANT METRO PLANET | 662324.21 | |
VARAMANT METRO PLANET | 55555.21 | Удалить |
VARAMANT METRO PLANET | 267117.5499 | |
FANTHOM STREET LLB | 83265.2799 | |
FANTHOM STREET LLB | -444452.96 | Удалить |
FANTHOM STREET LLB | 267117.5499 |
df2
my_dict = {'VT METRO PLANET ': 267117.5499, 'VENTILLA HOME FA ': -277961.62, 'FANTHOM STREET ': 83265.2799}
df2 = pd.DataFrame(list(my_dict.items()),columns = ['Name','Price'])
Ожидаемый результат
Любая помощь будет оценена
Комментарии:
1. Если кому-то нужна дополнительная информация, дайте мне знать
2. Да, пожалуйста, используйте код или текст, чтобы отобразить ваши входные фреймы данных.
3. @ScottBoston: подробная информация приведена в коде и таблице
4. Можете ли вы оценить, сколько будет уникальных значений «name»? Если оно меньше нескольких 1000, вы можете использовать
df1.Name.unique()
иdf2.Name.unique()
, а затем создать соответствующий df, где вы можете найти совпадение для последующего сравнения. Если это намного больше, чем несколько 1000 имен, время, необходимое для построения этой сравнительной таблицы, будет расти все больше и больше… Получив этот df, вы можете сначала объединить его с df1 (как =»left») и объединить результат с df2. А затем обновите флаг, потому что объединенная таблица имеет обе цены.5. @576i df1 имеет около 1100 (уникальных 52) строк и 16 столбцов, df2 имеет 82 (уникальных 14) строк и только 2 столбца, для пояснения упоминается ограниченная выборка
Ответ №1:
решение, которым я делюсь здесь для этой проблемы, основано на наборе, поэтому, если имя фрейма данных 1 имеет хотя бы одно общее слово с именем фрейма данных 2, а также их цена равна, тогда мы редактируем столбец флага в фрейме данных 1 с помощью «Удалить», в противном случае мы сделали его как «Нет»
Это исходный код :
def check(row):
df1_Name = set(map(lambda word: word.lower(),row.Name.split(' ')))
df1_price = row.Price
df1_flag = row.Flag
for df2_Name, df2_Price in df2[['Name', 'Price']].values:
df2_Name = set(map(lambda word: word.lower(),df2_Name.split(' ')))
if len(df1_Name.intersection(df2_Name)) > 1 and df1_price == df2_Price:
return 'Delete'
return ''
df1["Flag"]= df1.apply(checkMatch,axis=1)
Комментарии:
1. Вместо столбца df1 [«Флаг»] используется дополнительный столбец df1 [«Флаг1»] и возвращаемое значение из функции. Позже добавлен код
cond = df1["Flag"] == 'Delete' , df1['Flag'][cond] = df1['Flag1'][cond]