Соответствие частичных выражений между фреймами данных

1

Я пытаюсь выполнить частичное совпадение строк между столбцами в кадрах данных, например:

df_A:

Items_A
purse
string
hat
glue
gum
cherry
cherry
cherry pie

а также

df_B:

1       2    3
string  gum  cherry
glue

желаемый выход:

df_matched:

matched Items_A
0       purse
1       string
0       hat
1       glue
2       gum
3       cherry
3       cherry
3       cherry pie

Обратите внимание, что числа в сопоставленных столбцах - это метки из сопоставленного столбца: 1, 2 или 3. Если совпадения нет, то метка равна 0.

Я смог использовать регулярное выражение, соответствующее нескольким вложенным циклам, но задавался вопросом, есть ли способ использовать библиотеки panda для более эффективного выполнения операции.

  • 0
    Возможно ли несколько совпадений? Что должно произойти в таком случае?
  • 0
    для нескольких совпадений должен применяться один и тот же ярлык, я обновил пример на основе вашего комментария.
Теги:
pandas

1 ответ

1
Лучший ответ
  • Reshape df_B, чтобы получить это:

       level_0  level_1       0
    0        0        1  string
    1        0        2     gum
    2        0        3  cherry
    3        1        1    glue
    
  • переименовать столбцы df_B

  • получить список уникальных слов в df_B
  • создайте новый столбец в df_B, чтобы найти соответствующее слово из df_B в df_A
  • Объединить и фильтровать
import regex

df_B = df_B.stack().reset_index()

df_B = df_B.rename(columns={"level_1": "matched", 0: "Items_A"})

items = df_B.Items_A.unique()

def partial_match(x, items):
    for item in items:
        if regex.search(r'.?'+item+'.?', x):
            return item
    return 0

df_A["matching_item"] = df_A["Items_A"].apply(lambda x: partial_match(x, items))


df_A = df_A.merge(df_B, how="left", left_on="matching_item", right_on="Items_A", suffixes=('', '_y'))

df_A = df_A.loc[:,["Items_A", "matched"]]
  • 0
    это работает, если есть точное совпадение, но не с частичным совпадением. Я изменю пример, чтобы отразить это.
  • 0
    ок жду обновления
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню