Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧上应用正则表达式函数_Python_Regex_Pandas_Dataframe_Data Manipulation - Fatal编程技术网

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

Python 在数据帧上应用正则表达式函数,python,regex,pandas,dataframe,data-manipulation,Python,Regex,Pandas,Dataframe,Data Manipulation,我在熊猫中有一个数据帧,如: 0 1 2 ([0.8898668778942382 0.89533945283595] 0) ([1.2632564814188714 1.0207660696232244] 0) ([1.006649166957976 1.1180973832359227] 0) ([0.9653632916751714 0.8625538463644129] 0) (

我在熊猫中有一个数据帧,如:

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


性能

小的 大(
df*10000

为什么不能直接使用正则表达式对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
这仍然比其他答案快

传递
remSp
而不使用
()
,参数是函数本身,而不是调用的结果。applymap函数随后将调用
remSp
,对您传递的数据帧中的每个项目都要寻找
df.applymap(remSp)
,注意,在传递之前不想调用函数,
.applymap
将函数作为参数。注意,您可能希望在regex模式中向您的组添加一个
。。我尝试了[df.applymap(remSp)],但返回了一个包含所有值的数据帧None@MichailN是的,因为
remSp
总是按照您定义的方式返回
None
。@COLDSPEED,尽管我喜欢一行,但您的答案执行得更好,先生@米切林。认真地单行程序被高估了。@COLDSPEED有时风格比性能好,但无论如何你都是correct@MichailN在我不得不直接打断别人的回答之前,我的回答没有投票权。。。认真地没人喜欢圈之类的-(@cᴏʟᴅsᴘᴇᴇᴅ -- 我同意,我自己也很在意性能;)在标记就地操作和返回副本的函数时,您可能需要小心。在前一种情况下,在第一次替换完成后,剩下的99个测试循环实际上并没有执行相同的操作,明白吗?@JohnGalt让我用1个循环重新运行。并且,检查在循环中移动
astype(float)
是否会进一步改进它。@JohnGalt用一个循环重新运行。而且,在循环中输入一个字会使情况变得更糟。@cᴏʟᴅsᴘᴇᴇᴅ 我的答案呢?我试过这一行,它给了我以下错误:“无法将字符串转换为浮点”有什么想法吗?在这之后,请尝试删除
.astype(float)
,并使用
.apply(lambda x:pd.to_numeric(x,errors='concurve'),1)
,该错误可能是因为列中存在一些
nan
或未知字符串。
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.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