【问题标题】:Matching partial expressions between dataframes匹配数据帧之间的部分表达式
【发布时间】:2018-09-25 17:38:31
【问题描述】:

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

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 的库来更有效地执行操作。

【问题讨论】:

  • 是否有可能多次匹配?这种情况应该怎么办?
  • 多个匹配项应该应用相同的标签,我根据您的评论更新了示例。

标签: python pandas


【解决方案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"]]

【讨论】:

  • 这在完全匹配时有效,但在部分匹配时无效。我将修改示例以反映这一点。
  • 已经完成了。 'cherry pie' 将与示例中的 'cherry' 匹配
猜你喜欢
  • 2018-04-18
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多