代码之家  ›  专栏  ›  技术社区  ›  Gerry

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

  •  0
  • Gerry  · 技术社区  · 5 年前

    我有一个大数据框,有超过1200万行和一列 timelogs 是字母数字和一些特殊字符的混合体。我想从中删除所有非数字字符 时间日志 pd.to_datetime(df['timestr']) 要执行此操作:

    df.loc[:, 'timestr'] = df['timelogs'].str.replace('([^0-9]+)', '')
    

    0 回复  |  直到 5 年前
        1
  •  1
  •   Stef    5 年前

    你可以用 translate 使用以下翻译表:

    import string
    tt = str.maketrans('', '', string.ascii_letters + string.punctuation + string.whitespace)
    

    在我的测试中,长度为20的100K个字母数字串比 replace .

    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)
    

    翻译 关于 代替

    enter image description here