【问题标题】:Vectorized version of pandas Series.str.findpandas Series.str.find 的矢量化版本
【发布时间】:2022-11-29 22:39:20
【问题描述】:

pandas 中的 Series.str.find() 函数似乎只需要一个整数作为起始位置。我有一个包含字符串和起始位置数组的系列,我想从每个元素的相应位置开始找到给定子字符串的位置,如下所示:

a = pd.Series(data=['aaba', 'ababc', 'caaauuab'])
a.str.find('b', start=[0, 1, 2])  # returns a series of NaNs

我可以使用列表理解来做到这一点:

[s.find('b', pos) for s, pos in zip(a.values, [0, 1, 2])]

numpy 或 pandas 中是否有函数可以直接更快地执行此操作?另外,有没有一个也可以接受一组子字符串?

【问题讨论】:

    标签: python pandas string


    【解决方案1】:

    我认为这是一种更 pythonic 的方式,因为您不必担心索引:

    import pandas as pd
    
    def find_from_index(series: pd.Series, to_find: str) -> pd.Series:
        return pd.Series([v.find(to_find, i) for i, v in enumerate(series)])
    
    a = pd.Series(data=['aaba', 'ababc', 'cbaauuab'])
    b = find_from_index(a, 'b')
    

    希望这可以帮助

    【讨论】:

      【解决方案2】:

      不,没有,向量化字符串操作很困难。

      您可以考虑 convert your strings to arrays of characters,但转换将是限制步骤。快速测试告诉我,这与执行问题中提供的列表理解所花费的时间大致相同。我们甚至还没有搜索过这个职位。

      简而言之,您当前的方法似乎是最有效的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-11
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 2022-10-19
        • 1970-01-01
        • 2017-02-28
        相关资源
        最近更新 更多