【发布时间】: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。这不会为您提供您想要的答案,因为该值会根据行而变化。