2016-07-28 46 views
2

我有一個包含需要清理匹配各種正則表達式模式的字符串的文本的熊貓數據框列。我當前的嘗試(下面給出)循環遍歷每個模式,創建包含匹配的新列(如果找到),然後在數據框中循環,在找到的匹配處拆分列。然後我放棄不需要的匹配列're_match'。刪除與熊貓系列中的多個正則表達式模式匹配的字符串

雖然這適用於我目前的使用情況,但我不禁想到,無需使用iterrows()並創建一個新列,在熊貓中一定有更高效,矢量化的方法。我的問題是,是否有一個更理想的方式去除匹配列中多個正則表達式模式的字符串?

在我目前的使用情況下,不需要的字符串總是在文本塊的末尾,因此使用split(...)[0]。但是,如果不需要的字符串可以從文本中的任何一點提取出來,那就太好了。

此外,請注意,將正則表達式組合成一個長單個模式將是不可取的,因爲有數十種模式會定期更改。

df = pd.read_csv('data.csv', index_col=0) 
patterns = [ 
    '(regex1 \d+)', 
    '((?: regex 2)? \d{1,2})', 
    '(\d{0,2}.?\d{0,2}-?\d{1,2}.?\d{0,2}regex3)', 
] 

for p in patterns: 

    df['re_match'] = df['text'].str.extract(
     pat=p, flags=re.IGNORECASE, expand=False 
    ) 
    df['re_match'] = df['re_match'].fillna('xxxxxxxxxxxxxxx') 

    for index, row in df.iterrows(): 
     df.loc[index, 'text'] = row['text'].split(row['re_match'])[0] 

df = df.drop('re_match', axis=1) 

謝謝您的幫助

+0

我不熟悉'pandas',但這裏我所瞭解的問題可能來自稱爲'dataframe'的數據結構。克服這個任務的簡單方法可能只是使用純Python或sed。 – fronthem

回答

0

確實存在,它被稱爲df.applymap(some_function)
請看下面的例子:

from pandas import DataFrame 
import pandas as pd, re 
df = DataFrame({'key1': ['1000', '2000'], 'key2': ['3000', 'digits(1234)']}) 

def cleanitup(val): 
    """ Multiplies digit values """ 
    rx = re.compile(r'^\d+$') 
    if rx.match(val): 
     return int(val) * 10 
    else: 
     return val 

# here is where the magic starts 
df.applymap(cleanitup) 

很顯然,我和好了,但現在與數字之前的每一個細胞,這些都被乘以10,每隔值已保持不變。
有鑑於此,您可以根據需要在功能cleanitup()中檢查並重新排列您的值。

相關問題