我有类似下面的示例数据的数据,我正在尝试模式匹配并解析它以创建类似输出数据的东西。我的想法是,如果我有一个字符串值包含“Aggr(”然后在括号中解析“stuff”并解析下一个括号前面的逗号后面的“某事”。有没有一个光滑的方法来做到这一点与正则表达式一样,还是需要几个循环?
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 :(得分: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>[^\\(]*)
捕获您需要的两种模式(其中一种模式为Aggr\\((?P<Part1>.*?)\\)
,名为 part1 :之后的第一个括号中的内容Aggr ,另一个是名为 part2 的,(?P<Part2>[^\\(]*)
:在下一个括号之前的第一个模式之后的逗号之后的模式。)
答案 1 :(得分:1)
您可以将str.extractall与正则表达式模式匹配
一起使用SampleDf[['Part1', 'Part2']]=SampleDf.OtherField.str.extractall('\((.*)\),(.*)').reset_index(drop = True)
你得到了
ReportField OtherField Part1 Part2
0 tom words Aggr(stuff),something1 stuff something1
1 bob Morewords Aggr(Diffstuff),something2 Diffstuff something2