2017-07-13 11 views
1

私は以下のサンプルデータのようなデータを持っています。パターンマッチングとパースを行い、出力データのようなものを作成しようとしています。アイデアは、 "Aggr("括弧の中に "stuff"を解析し、次の括弧の前にコンマの後に続く "something"を解析するという文字列値がある場合です。これを行うには滑らかな方法がありますか? ?のような正規表現、またはそれがループのカップルを必要とする予定です文字列から複数の値を取り出す

Sample Data: 

SampleDf=pd.DataFrame([['tom',"words Aggr(stuff),something1)"],['bob',"Morewords Aggr(Diffstuff),something2"]],columns=['ReportField','OtherField']) 

Sample Output: 

OutputDf=pd.DataFrame([['tom',"words Aggr(stuff),something1",'stuff', 'something1'],['bob',"Morewords Aggr(Diffstuff),something2",'Diffstuff','something2']],columns=['ReportField','OtherField','Part1','Part2']) 
+0

を取得

SampleDf[['Part1', 'Part2']]=SampleDf.OtherField.str.extractall('\((.*)\),(.*)').reset_index(drop = True) 

に一致する正規表現パターンでstr.extractall使用することができます。私は正規表現でうまくやれると確信しています。 – Fabien

答えて

3

であなたは、文字列のパターンをキャプチャし、カラム内にそれぞれを変換するstr.extractを使用することができます。

pd.concat([ 
     SampleDf, 
     SampleDf.OtherField.str.extract(r"Aggr\((?P<Part1>.*?)\),(?P<Part2>[^\(]*)", expand=True) 
    ], axis=1) 

# ReportField        OtherField  Part1  Part2 
#0   tom   words Aggr(stuff),something1  stuff something1 
#1   bob Morewords Aggr(Diffstuff),something2 Diffstuff something2 

正規表現Aggr\\((?P<Part1>.*?)\\),(?P<Part2>[^\\(]*)必要な2つのパターンをキャプチャします(1つはAggr\\((?P<Part1>.*?)\\)その1:次の括弧の前に第一のパターン次コンマ後のパターン):別集計、別のある,(?P<Part2>[^\\(]*)名前その2後の最初の括弧内のコンテンツ。

+0

ありがとうございます!これは私が探していたもので、ループよりはるかに簡単です。非常にクールで、非常に滑らかです。 – ndderwerdo

+0

クール。喜んでそれが役立ちます。 – Psidom

1

あなたはあなたがそれはあなたがオンラインPythonの正規表現をテストすることができますhttps://regex101.comを見てみましょう

ReportField OtherField        Part1  Part2 
0 tom   words Aggr(stuff),something1   stuff  something1 
1 bob   Morewords Aggr(Diffstuff),something2 Diffstuff something2 
関連する問題