【问题标题】:Split column of text into column of lists in Pandas dataframe with no unambiguous split sequence将文本列拆分为 Pandas 数据框中的列表列,没有明确的拆分序列
【发布时间】:2021-03-29 12:05:35
【问题描述】:

我有一个数据框,其中包含一列文本,该列给出数字代码,后跟冒号和文本描述。文本可能包含一个或多个代码描述符,每个代码描述符由逗号和空格分隔。

myDF = pd.DataFrame({'origtext':['012: some text','012: some text, 123: other text','012: some text, 234: text, strings and numbers']})

数据框如下所示:

                                         origtext
0                                  012: some text
1                 012: some text, 123: other text
2  012: some text, 234: text, strings and numbers

我需要将“origtext”列中的文本转换为列表,其中列表的每个元素都由数字代码、冒号和文本描述符组成。

我的第一种方法是使用.split()', ' 处的文本拆分,例如:

myDF['textlist'] = myDF['origtext'].str.split(', ')

生产...

                                           textlist  
0                                  [012: some text]  
1                 [012: some text, 123: other text]  
2  [012: some text, 234: text, strings and numbers]  

在我的实际数据框中,这对大多数行都有效,但在少数情况下,文本描述包含 ', '。这意味着上面示例中的底部列表包含 3 个元素(而不是 2 个),并且最后一个元素不是以 'nnn: ' 开头的。这使得.split() 方法不合适。

有没有办法在正则表达式中使用匹配组来识别', 123:' 之类的内容并将其替换为'xxxxx123:',然后根据'xxxxx' 进行拆分?我已经能够用字符串替换匹配的组,但我无法弄清楚如何在保持匹配文本不变的同时向匹配组添加一些文本。

或者有没有其他方法可以达到预期的结果?

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用

    myDF['textlist'] = myDF['origtext'].str.split(r',\s+(?=\d+:)')
    

    请参阅regex demo

    正则表达式详细信息

    • , - 逗号
    • \s+ - 一个或多个空白字符
    • (?=\d+:) - 一个正向前瞻,需要一个或多个数字,然后在当前位置右侧紧接一个 :

    【讨论】:

    • 啊,是的!我没有想过对拆分字符串使用积极的前瞻!这是一个非常巧妙的解决方案。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 2022-12-22
    • 2016-05-31
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多