Сравнить два фрейма данных на основе значения столбца (строка, подстрока) и обновить другое значение столбца

#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]