在 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
这仍然比其他答案快。
我在 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
这仍然比其他答案快。