2016-07-28 34 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()中检查并重新排列您的值。