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

6
我有一个名为test的DataFrame,其中包含一个包含文件路径的列,我想使用部分路径过滤数据。
                              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。这些数据框可能有很多行,因此我也担心 apply 函数可能不太有效率。
你有没有关于如何搜索DataFrame列的确切部分字符串匹配的任何建议?
谢谢!
1个回答

3

您可以传递 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。)

谢谢DSM!我应该在文档中注意到那个问题。(我也认为lambda表达式应该可以工作。“ex”在代码中肯定是定义好的……也许这与我在使用Python调试器“set_trace”时尝试有关)。 - endangeredoxen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接