在 pandas 数据帧上应用正则表达式函数

Apply a regex function on a pandas dataframe

我在 pandas 中有一个数据框,例如:

0                       1                   2
([0.8898668778942382    0.89533945283595]   0)
([1.2632564814188714    1.0207660696232244] 0)
([1.006649166957976     1.1180973832359227] 0)
([0.9653632916751714    0.8625538463644129] 0)
([1.038366333873932     0.9091449796555554] 0)

所有值都是字符串。我想删除所有特殊字符并转换为双精度。我想应用一个函数来删除除点之外的所有特殊字符

import re
re.sub('[^0-9.]+', '',x)

所以我想在数据框的所有单元格中应用它。我该怎么做?我找到了 df.applymap 函数,但我不知道如何将字符串作为参数传递。我试过了

def remSp(x): 
    re.sub('^[0-9]+', '',x)

df.applymap(remSp())

但我不知道如何将单元格传递给函数。有更好的方法吗?

谢谢

使用applymap

In [814]: df.applymap(lambda x: re.sub(r'[^\d.]+', '', x)).astype(float)
Out[814]:
          0         1    2
0  0.889867  0.895339  0.0
1  1.263256  1.020766  0.0
2  1.006649  1.118097  0.0
3  0.965363  0.862554  0.0
4  1.038366  0.909145  0.0

使用transform

In [809]: df.transform(lambda x: x.str.replace(r'[^\d.]+', '')).astype(float)
Out[809]:
          0         1    2
0  0.889867  0.895339  0.0
1  1.263256  1.020766  0.0
2  1.006649  1.118097  0.0
3  0.965363  0.862554  0.0
4  1.038366  0.909145  0.0

迭代列,调用str.replace

for c in df.columns:
    df[c] = df[c].str.replace('[^\d.]', '')

df = df.astype(float)
df
          0         1  2
0  0.889867  0.895339  0
1  1.263256  1.020766  0
2  1.006649  1.118097  0
3  0.965363  0.862554  0
4  1.038366  0.909145  0

不幸的是,pandas 尚不支持对整个数据帧的字符串访问器操作,因此循环遍历列的替代方法会更慢,例如 lambdised applymap/transform


性能

100 loops, best of 3: 2.04 ms per loop  # applymap 
100 loops, best of 3: 2.69 ms per loop  # transform
1000 loops, best of 3: 1.45 ms per loop  # looped str.replace

大 (df * 10000)

1 loop, best of 3: 618 ms per loop  # applymap 
1 loop, best of 3: 658 ms per loop  # transform
1 loop, best of 3: 341 ms per loop  # looped str.replace
1 loop, best of 3: 212 ms per loop  # df.replace

为什么不能直接使用正则表达式在 df 上使用默认替换方法,即

df = df.replace('[^\d.]', '',regex=True).astype(float)
          0         1    2
0  0.889867  0.895339  0.0
1  1.263256  1.020766  0.0
2  1.006649  1.118097  0.0
3  0.965363  0.862554  0.0
4  1.038366  0.909145  0.0

这仍然比其他答案快。