Я пытаюсь выполнить частичное совпадение строк между столбцами в кадрах данных, например:
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 для более эффективного выполнения операции.
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
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"]]