2016-07-28 5 views
2

私は様々な正規表現パターンにマッチする文字列を削除する必要のあるテキストを含むPandasデータフレーム列を持っています。私の現在の試み(下記)は、各パターンをループし、見つかった場合は一致を含む新しい列を作成し、次にデータフレームをループして、見つかった一致で列を分割します。次に、不要な一致列 're_match'を削除します。パンダシリーズから複数の正規表現パターンに一致する文字列を削除する

これは私の現在の使用例では機能しますが、iterrows()を使用せずに新しい列を作成することなく、パンダでこれを行うより効率的でベクター化された方法が必要であると考えることはできません。私の質問は、列から複数の正規表現パターンに一致する文字列を削除する最適な方法はありますか?

私の現在の使用例では、不要な文字列は常にテキストブロックの末尾にあるため、split(...)[0]を使用しています。しかし、テキスト内の任意の点から不要な文字列を抽出できれば素晴らしいでしょう。

正規表現を1つの長い単一パターンにまとめると、数十のパターンが定期的に変更されるため、不可能になることに注意してください。

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) 

あり、確かで、それはdf.applymap(some_function)と呼ばれるあなたの助け

+0

私は 'pandas'に慣れていませんが、ここで私が理解している問題は' dataframe'というデータ構造から来るかもしれません。この作業を克服する簡単な方法は、単に純粋なpythonまたはsedを使用することです。 – fronthem

答えて

0

いただきありがとうございます。
は、次の例を考えてみましょう:

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()で値を確認して並べ替えることができます。

関連する問題