使用正則表達式似乎是最快的:
df['text'].str.findall('\w{4,}').str.join(' ')
時序
使用以下設置:
df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog", "foo bar baz", 'words exceeding desired length']})
df = pd.concat([df]*10**4, ignore_index=True)
def pir2(df):
t = df.text.str.split(expand=True).stack()
return t.loc[t.str.len() >= 4].groupby(level=0).apply(' '.join)
我得到以下計時:
%timeit df['text'].str.findall('\w{4,}').str.join(' ')
10 loops, best of 3: 44.8 ms per loop
%timeit df.text.apply(lambda i: ' '.join(filter(lambda j: len(j) > 3, i.split())))
10 loops, best of 3: 79.3 ms per loop
%timeit df['text'].str.split().map(lambda sl: " ".join(s for s in sl if len(s) > 3))
10 loops, best of 3: 87.2 ms per loop
%timeit pir2(df)
1 loop, best of 3: 2.87 s per loop
我會考慮接受@piRSquared的解決方案。我覺得這更像是「潘多祿」。不過,獲得一些性能比較會很有趣,並讓最快的勝利! –