簡體   English   中英

在熊貓數據框上應用正則表達式功能

[英]Apply a regex function on a pandas dataframe

我在熊貓中有一個數據框,例如:

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())

但我不知道如何將單元格傳遞給函數。 有更好的方法嗎?

謝謝

為什么不能直接使用regex在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

這仍然比其他答案更快。

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM