在数据框之间匹配部分表达式

时间:2018-09-25 06:33:12

标签: python pandas

例如,我正在尝试在数据帧中的列之间执行部分字符串匹配:

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。

我能够使用带有多个嵌套循环的正则表达式匹配,但想知道是否有一种方法可以使用熊猫的库来更有效地执行操作。

1 个答案:

答案 0 :(得分:1)

  • 重塑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"]]