熊猫字符串搜索部分字符串

时间:2019-06-12 20:06:51

标签: python pandas

我有以下数据

list = ['good dog','bad cat']

pattern = '|'.join(list)

|column|
|---|
|bad cat|
|good dog|
|cat|
|dog|

当我将字符串包含在大熊猫中时,只有完全匹配的字符串才会获得True输出,如下所示

df[column].str.contains(pattern,regex=True)

|column|
|---|
|True|
|True|
|False|
|False|

是否可以执行诸如模糊匹配之类的操作,其中还检查了模式中的部分字符串?既然“猫”和“狗”部分存在,那么输出将全部为真?

谢谢。

1 个答案:

答案 0 :(得分:1)

自定义指标

写一个粗略的模糊匹配度量。您可能可以通过删除高频词并适当词干来调整此指标。

<ul>
   <li class="home menu"><a href="#home.html">Home</a>
       <ul class="home-dropdown">
           <li><a href="#vocalcoaching">Vocalcoaching</a></li>
           <li><a href="#circlesinging">Circlesinging</a></li>
       </ul>
    </li>

   <li class="uber menu"><a href="#uber.ich.html">Über mich</a></li> 
   <li class="vocal menu"><a href="#">Vocalcoaching</a>
       <ul class="vocal-drop">
           <li><a href="#vocalcoaching">Gesangunterricht</a></li>
           <li><a href="#songwriting">Songwriting</a></li> 
           <li><a href="#tech">Technische Geräte</a></li> 
       </ul>
   </li>

   <li class="circle menu"><a href="#">Circlesinging</a>
       <ul class="circle-drop">
           <li><a href="#what">Was ist Was</a></li>
           <li><a href="#volume1">Volume 1</a></li> 
           <li><a href="#volume2">Volume 2</a></li>
           <li><a href="#volume3">Volume 3</a></li>
       </ul>
   </li>
</ul>

这将计算一个列表中的单词数与另一个列表中的单词数。

我们建立了一个数据框来帮助说明。

def fuzz(a, b):
    a = np.asarray(a)
    b = np.asarray(b)
    c = a[:, None] == b[None, :]
    return min(c.max(0).mean(), c.max(1).mean())

我们可以看到第一行d = pd.DataFrame([ [fuzz(a, b) for b in map(str.split, lst)] for a in df.column.str.split() ], df.index, lst) d good dog bad cat 0 0.0 1.0 1 1.0 0.0 2 0.0 0.5 3 0.5 0.0 和第二行1.0的度量分别为'bad cat'。对于第三行和第四行,我们得到'good dog'的量度,表示匹配的单词的一半。

现在,您设置了一个阈值,并查找行中是否有任何超过阈值的东西:

阈值为0.5

.5

阈值为df[d.ge(.5).any(1)] column 0 bad cat 1 good dog 2 cat 3 dog

.6

Levenshtein

使用Levenshtein的距离比

df[d.ge(.6).any(1)]

     column
0   bad cat
1  good dog

您可以执行与上述相同的阈值分析。