Pandas str.contains 用于部分字符串的精确匹配

Posted

技术标签:

【中文标题】Pandas str.contains 用于部分字符串的精确匹配【英文标题】:Pandas str.contains for exact matches of partial strings 【发布时间】:2016-01-16 13:59:07 【问题描述】:

我有一个 DataFrame(我称之为test),其中有一列包含文件路径,我想使用部分路径过滤数据。

                              full_path
0    C:\data\Data Files\BER\figure1.png
1    C:\data\Data Files\BER\figure2.png
2    C:\data\Previous\Error\summary.png
3        C:\data\Data Files\Val\1x2.png
4        C:\data\Data Files\Val\2x2.png
5         C:\data\Microscopy\defect.png

找到的部分路径是:

ex = 'C:\\data\\Microscopy'

我试过str.contains 但是,

test.full_path.str.contains(ex)

0    False
1    False
2    False
3    False
4    False
5    False

我预计索引 5 的值为 True。起初我认为问题可能在于路径字符串实际上不匹配,因为与转义字符不同,但是:

ex in test.full_path.iloc[5]

等于True。经过一番挖掘,我认为str.contains 的参数应该是一个正则表达式,所以部分路径中的“\”可能把事情搞砸了?

我也试过了:

test.full_path.apply(lambda x: ex in x)

但这给出了NameError: name 'ex' is not defined。这些 DataFrame 中可能有很多行,所以我还担心 apply 函数可能效率不高。

关于如何在 DataFrame 列中搜索 exact 部分字符串匹配项的任何建议?

谢谢!

【问题讨论】:

【参考方案1】:

您可以将regex=False 传递给str.contains,以避免在解释参数时混淆:

>>> df.full_path.str.contains(ex)
0    False
1    False
2    False
3    False
4    False
5    False
Name: full_path, dtype: bool
>>> df.full_path.str.contains(ex, regex=False)
0    False
1    False
2    False
3    False
4    False
5     True
Name: full_path, dtype: bool

(除此之外:您的 lambda x: ex in x 应该可以工作。NameError 表明您由于某种原因没有定义 ex。)

【讨论】:

感谢帝斯曼!我应该在文档中发现这一点。 (我还认为 lambda 表达式应该可以工作。ex 肯定是在代码中定义的......也许它与我使用 python 调试器在set_trace 尝试它的事实有关)。

以上是关于Pandas str.contains 用于部分字符串的精确匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中向 .str.contains 添加多个字符串? [复制]

pandas str.contains 匹配多个字符串并获取匹配的值

pandas:如何限制 str.contains 的结果?

str.contains 是不是有替代代码用于一个值而不是系列?

Python 文本处理(str.contains)

如何在 pandas str.contains 中使用 \b 单词边界?