![](/img/trans.png)
[英]get partial string contained in “()” from a pandas DataFrame
[英]Remove partial string from dataframe with Pandas
如果我有这样的数据帧:
id str
01 abc_d(a)
02 ab_d(a)
03 abcd_e(a)
04 a_b(a)
我如何获得如下数据帧? 对不起,我构建这个数据框来代表我的真实问题。 谢谢。
id str
01 d
02 d
03 e
04 b
使用extract
df['str']=df['str'].str.extract("\_(.*)\(",expand=True)
df
Out[585]:
id str
0 1 d
1 2 d
2 3 e
3 4 b
(错误的答案)
Series.str.split
汤 df['str'] = df['str'].str.split('(').str[0].str.split('_').str[-1]
df
id str
0 1 d
1 2 d
2 3 e
3 4 b
(少回答错误)
Series.str.extract
df['str'] = df['str'].str.extract(r'_([^_]+)\(', expand=False)
df
id str
0 1 d
1 2 d
2 3 e
3 4 b
正则表达式方法带来了相当大的开销,而str.extract
并没有太大的帮助使事情变得更好。
(更好的答案)
re.search
import re
p = re.compile(r'(?<=_)[^_]+(?=\()')
df['str'] = [p.search(x)[0] for x in df['str'].tolist()]
df
id str
0 1 d
1 2 d
2 3 e
3 4 b
这应该比上述方法更快。 我发现与大多数矢量化字符串pandas方法相比,列表推导非常快,即使这确实使用了正则表达式。 我提前预编译模式以减轻一些性能问题。
(也是一个更好的答案)
str.split
与list comp df['str'] = [
x.split('(', 1)[0].split('_')[1] for x in df['str'].tolist()
]
df
id str
0 1 d
1 2 d
2 3 e
3 4 b
这结合了两个世界的优点,列表comp的性能和纯python字符串拆分的速度。 应该是最快的。
性能
df_test = pd.concat([df] * 10000, ignore_index=True)
%timeit df_test['str'].str.extract(r'_([^_]+)\(', expand=False)
%timeit df_test['str'].str.split('(').str[0].str.split('_').str[-1]
%timeit [p.search(x)[0] for x in df_test['str'].tolist()]
%timeit [x.split('(', 1)[0].split('_')[1] for x in df_test['str'].tolist()]
70.4 ms ± 623 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
99.6 ms ± 730 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
31 ms ± 877 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
30 ms ± 431 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) # fastest but not by much
可能是你可以尝试split
类似的例子 :
df['str'] = df['str'].str.split('_').str.get(1).str[0]
要么,
df['str'] = df['str'].str.split('_').str.get(1).str.split('(').str[0]
使用pd.Series.str.split
。 具体到您的特定格式。
df['str'] = df['str'].str.split('_').str[-1].str[0]
print(df)
id str
0 1 d
1 2 d
2 3 e
3 4 b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.