首页 > 解决方案 > 如何在一个熊猫列中拆分文本以创建以分隔符为列名的新列

问题描述

我在数据框中有(组成)文本,如下所示:

My Hospital\r\n\r\nPatient Name MS Bilbo Baggins\r\nDate of Birth 12/11/1932\r\nHospital Number:122222D\r\nDate of Procedure 09/11/2018\r\n\r\nEndoscopist:Dr. Jonny BeGood:\r\n2nd Endoscopist:\r\nReferring Physician \r\nGeneral Practicioner Dr Gilbert Prior

我想根据分隔符拆分数据,以便分隔符成为列名。我最终会得到

Raw Text                Patient Name       Date of Birth    Hospital Number   Date of Procedure:    Endoscopist:    Endoscopist:  Referring Physician :   General Practicioner:
                         MS Bilbo Baggins    12/11/1932      122222D           09/11/2018          Dr. Jonny BeGood    NA          NA                     NA

一个棘手的部分是分隔符并不总是以相同的顺序出现,但如果这不是一件容易解决的事情,那么它很高兴成为答案的第二部分。

作为第一次尝试,我尝试了以下Mydf.body_analysed.str.extract('(Patient Name.*?Date of Birth)')

但没有提取任何内容,我怀疑这是因为回车使事情进一步复杂化。

标签: pythonpandassplit

解决方案


采用series.str.extract()

解释

正则表达式模式:f'[\n]*{c}[:]*[\r]*[\n]*([A-Za-z0-9/. ]+)[:]*[\r]*'

  • [\n]*{c}: 它将搜索每个值 "c" 后跟零次或多次出现的\n
  • [:]*[\r]*[\n]*: 零次或多次出现: , \r , \n顺序。
  • ([A-Za-z0-9/. ]+):捕获可以包含定义的字母和符号集的所需单词
  • [:]*[\r]*:在捕获的单词之后出现零次或多次: , \r 。

完整代码:

Mydf = pd.DataFrame({"body_analysed": ["My Hospital\r\n\r\nPatient Name MS Bilbo Baggins\r\nDate of Birth 12/11/1932\r\nHospital Number:122222D\r\nDate of Procedure 09/11/2018\r\n\r\nEndoscopist:Dr. Jonny BeGood:\r\n2nd Endoscopist:\r\nReferring Physician \r\nGeneral Practicioner Dr Gilbert Prior"]})

columns = ["Patient Name","Date of Birth","Hospital Number","Date of Procedure","Hospital Number","Endoscopist","2nd Endoscopist","General Practicioner"]
for c in columns:
    Mydf[c] = Mydf["body_analysed"].str.extract(f'[\n]*{c}[:]*[\r]*[\n]*([A-Za-z0-9/. ]+)[:]*[\r]*')

输出:

       body_analysed                                            Patient Name    Date of Birth   Hospital Number Date of Procedure   Endoscopist        2nd Endoscopist    General Practicioner
    0   My Hospital\r\n\r\nPatient Name MS Bilbo Baggi...   MS Bilbo Baggins    12/11/1932      122222D           09/11/2018        Dr. Jonny BeGood   Referring Physician  Dr Gilbert Prior


推荐阅读