在大数据框中搜索和替换非数字数据的最佳方法

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: