【问题标题】:Pandas str.extract/ re.search using another series or column as a patternPandas str.extract/re.search 使用另一个系列或列作为模式
【发布时间】:2018-07-23 13:39:04
【问题描述】:
df = pd.DataFrame({'a':{0:'aa',1:'dd',2:'cc'},
                   'b':{0:'aa(bb)daa',1:'eedd(ed)',2:'affaa(f)'}})

    a   b
0   aa  aa(bb)daa
1   dd  eedd(ed)
2   cc  affaa(f)

我想提取括号内的字符,只要括号前的模式是df['a']中的值即可。

我尝试过使用:

def searcher(x):
    pat_result = re.search(x[0] + '\((.*?)\)', x[1])
    if pat_result:
        return pat_result.group(1)

df[['a','b']].apply(lambda x :searcher(x), axis=1)

0      bb
1      ed
2    None
dtype: object

%%timeit
df[['a','b']].apply(lambda x :searcher(x), axis=1)
1.33 ms ± 3.49 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


我只是想知道是否有更快的方法(但仍然在 pandas 中)或直接使用 str.extract?


有没有办法让这个工作?

df['b'].str.extract(df['a'] + '\((.*?)\)', expand=False)

【问题讨论】:

  • 也许使用 for 循环会稍微快一点
  • 我相信str.extract只能用于系列。在您的情况下,您正在对数据框进行操作。
  • @Wen 我希望用 pandas 来实现
  • @WStokvis 我添加到问题中。 df['b'].str.extract('aa' + '\((.*?)\)', expand=False) 这会起作用
  • @fcsr 您已经硬编码了df['a'] 中的值。在这种情况下,它是aa。这不会为您提供您想要的答案,因为该值会根据行而变化。

标签: python pandas


【解决方案1】:

这是一个使用循环的解决方案。我运行了几次解决方案,得到的时间不同,从比原始解决方案快到慢不等。

%%timeit
for i, j  in df.iterrows():
    pat_search = re.search(j['a']  + '\((.*?)\)', j['b'])
    if pat_search:
        j['c'] = pat_search.group(1)
#First Iteration
264 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
#Second Iteration
1.62 ms ± 78.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

为了与您的原始解决方案进行比较,

%%timeit
df[['a','b']].apply(lambda x :searcher(x), axis=1)

1.34 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

  • 感谢您的建议。我希望在熊猫本身中使用一些东西。我也可以[re.search(df['a'][x] + '\((.*?)\)',df['b'][x]).group(1) if re.search(df['a'][x] + '\((.*?)\)',df['b'][x]) else None for x in df.index] 96 µs ± 189 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
猜你喜欢
  • 2019-08-28
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2022-01-26
  • 2014-02-19
  • 2014-12-06
  • 2023-03-02
  • 2015-09-02
相关资源
最近更新 更多