在大数据框中搜索和替换非数字数据的最佳方法
Optimal way to search and replace non-numeral data in a big dataframe
我有一个超过 1200 万行的大数据框,其中一列 timelogs
是字母数字和一些特殊字符的混合。在通过执行 pd.to_datetime(df['timestr'])
最终将该列转换为日期时间之前,我想从 timelogs
中删除所有非数字字符。我正在执行以下操作以删除非数字字符,并且需要 30-45 分钟。 来执行此操作:
df.loc[:, 'timestr'] = df['timelogs'].str.replace('([^0-9]+)', '')
有没有办法更快地实现这一点?
您可以将 translate
与以下翻译一起使用 table:
import string
tt = str.maketrans('', '', string.ascii_letters + string.punctuation + string.whitespace)
在我对一系列长度为 20 的 100K 字母数字字符串的测试中,这比 replace
快大约 35%。
x = np.random.choice(list(string.ascii_letters + string.digits), [100_000, 20])
s = pd.Series([''.join(x[i]) for i in range(len(x))])
0 4r7xNfZyvbZjcg6sb9UY
1 GqQywPb0JCHcvRXWV8yV
2 8zyOOyC38qoztCZzshoP
3 iemM6xXIkf6xaoAPFlSr
4 uJYCeuftjkDQSwNchYU2
...
99995 ugH4TvzuEvB5f2Cp5Mlt
99996 SYXsz75l9qApOHJDoIF9
99997 34Xyz45JDx1HFojpWTL2
99998 BSyhzbx57H9V237PZgqp
99999 q9Bo9lwKw6O7y7G9G5aQ
Length: 100000, dtype: object
%timeit s.apply(lambda x: "".join([c for c in x if c.isdigit()]))
#174 ms ± 960 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit s.str.replace('([^0-9]+)', '')
#136 ms ± 443 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit s.str.translate(tt)
#88.5 ms ± 348 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
字符串越长越好 translate
相对于 replace
:
我有一个超过 1200 万行的大数据框,其中一列 timelogs
是字母数字和一些特殊字符的混合。在通过执行 pd.to_datetime(df['timestr'])
最终将该列转换为日期时间之前,我想从 timelogs
中删除所有非数字字符。我正在执行以下操作以删除非数字字符,并且需要 30-45 分钟。 来执行此操作:
df.loc[:, 'timestr'] = df['timelogs'].str.replace('([^0-9]+)', '')
有没有办法更快地实现这一点?
您可以将 translate
与以下翻译一起使用 table:
import string
tt = str.maketrans('', '', string.ascii_letters + string.punctuation + string.whitespace)
在我对一系列长度为 20 的 100K 字母数字字符串的测试中,这比 replace
快大约 35%。
x = np.random.choice(list(string.ascii_letters + string.digits), [100_000, 20])
s = pd.Series([''.join(x[i]) for i in range(len(x))])
0 4r7xNfZyvbZjcg6sb9UY
1 GqQywPb0JCHcvRXWV8yV
2 8zyOOyC38qoztCZzshoP
3 iemM6xXIkf6xaoAPFlSr
4 uJYCeuftjkDQSwNchYU2
...
99995 ugH4TvzuEvB5f2Cp5Mlt
99996 SYXsz75l9qApOHJDoIF9
99997 34Xyz45JDx1HFojpWTL2
99998 BSyhzbx57H9V237PZgqp
99999 q9Bo9lwKw6O7y7G9G5aQ
Length: 100000, dtype: object
%timeit s.apply(lambda x: "".join([c for c in x if c.isdigit()]))
#174 ms ± 960 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit s.str.replace('([^0-9]+)', '')
#136 ms ± 443 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit s.str.translate(tt)
#88.5 ms ± 348 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
字符串越长越好 translate
相对于 replace
: