清理字符串的最有效方法

Most efficient way to clean a string

我有一个庞大的数据集,我正在 删除字符串长度小于或等于 1 个单词的行:

a=a[~a['text'].str.split().str.len().le(1)]

上面的代码有效,但需要 18 分钟才能完成。

有没有最有效的方法来完成同样的任务?

在你的情况下 count 空白

a[a['text'].str.count(' ') >= 1]

您可以使用列表理解:

a[[len(x.split())>1 for x in a['text']]]

map:

one = 1
a[[*map(one.__lt__, map(len, map(str.split, a['text'])))]]

或转换为列表;然后 map 方法:

a[[*map(one.__lt__, map(len, map(str.split, a['text'].tolist())))]]

一些基准:

a = pd.DataFrame({'text': ['one word', 'two','three words ok']*100000})

>>> %timeit -n 10 a[~a['text'].str.split().str.len().le(1)]
328 ms ± 12.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit -n 10 a[a['text'].str.split().str.len().gt(1)]
325 ms ± 20.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit -n 10 a[a['text'].str.count(' ').gt(0)]
288 ms ± 12.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit -n 10 a[[len(x.split())>1 for x in a['text']]]
168 ms ± 3.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit -n 10 a[[*map(one.__lt__, map(len, map(str.split, a['text'])))]]
134 ms ± 1.93 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
>>> %timeit -n 10 a[[*map(one.__lt__, map(len, map(str.split, a['text'].tolist())))]]
114 ms ± 7.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)