【问题标题】:Pandas str.contains for exact matches of partial stringsPandas str.contains 用于部分字符串的精确匹配
【发布时间】:2023-03-24 19:39:01
【问题描述】:

我有一个 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 部分字符串匹配项的任何建议?

谢谢!

【问题讨论】:

    标签: python regex pandas contains


    【解决方案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 尝试它的事实有关)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2017-10-30
    • 2017-08-09
    • 2018-10-10
    • 2017-07-15
    • 2021-10-18
    相关资源
    最近更新 更多