gpt4 book ai didi

python - 使用 Pandas 从数据框中删除部分字符串

转载 作者:行者123 更新时间:2023-11-28 20:14:10 24 4
gpt4 key购买 nike

如果我有这样的数据框:

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

最佳答案

(错误答案)

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 with list comp

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 with 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

这结合了两全其美,列表组合的性能和纯 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

关于python - 使用 Pandas 从数据框中删除部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50731702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com