【问题标题】:Picking Multiple Values from String从字符串中选取多个值
【发布时间】:2017-07-13 02:21:31
【问题描述】:

我有类似下面示例数据的数据,我正在尝试进行模式匹配并对其进行解析以创建类似于输出数据的内容。这个想法是,如果我有一个包含“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'])

【问题讨论】:

  • 看看regex101.com 它允许您在线测试python regexps。我相信你可以用正则表达式做得很好。

标签: python string pandas


【解决方案1】:

您可以使用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

regex Aggr\\((?P&lt;Part1&gt;.*?)\\),(?P&lt;Part2&gt;[^\\(]*) 捕获您需要的两个模式(其中一个是 Aggr\\((?P&lt;Part1&gt;.*?)\\),命名为 part1Aggr之后的第一个括号中的内容>,另一个是,(?P&lt;Part2&gt;[^\\(]*),命名为part2:逗号后的模式跟在下一个括号之前的第一个模式之后)。

【讨论】:

  • 谢谢!!这正是我想要的,比循环简单得多。非常酷,非常漂亮。
  • 酷。很高兴它有帮助。
【解决方案2】:

您可以将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2016-07-12
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多