Python:如何在pandas中导入csv时将多行的内容折叠到一个单元格中

时间:2017-09-07 03:07:03

标签: python pandas

我正在尝试导入包含患者放射学报告的txt文件。每行应该是放射学检查(MRI / CT /等)。原始的txt文件看起来像这样:

Name | MRN | DOB | Type_Imaging | Report_Status | Report_Text
John Doe | 1234 | 01/01/1995 | MRI |Complete | Exam Number: A5678
Report status: final
Type: MRI of brain
-----------
REPORT:   
  HISTORY: History of meningioma, surveillance

  FINDINGS: Again demonstrated is a small left frontal parasaggital meningioma, not interval growth. Evidence of cerebrovascular disease unchanged from prior.

  Again demonstrated are post-surgical changes associated with prior craniotomy.
[report_end]
James Smith | 5678 | 05/05/1987 |CT | Complete |Exam Number: A8623
Report status: final
Type: CT of chest
-----------
REPORT:
  HISTORY: Admitted patient with new fever, concern for pneumonia

  FINDINGS: A CT of the chest demostrates bla bla bla
  bla bla bla

[report_end]

当我使用pd.read_csv('filename',sep ='|',header = 0)导入pandas时,我获得的df只有第一行中的报告文本的“考试编号:A5678”。然后,下一行在第一个单元格中具有“Report status:final”,而该行的其余部分具有NaN。第三行以第一个细胞中的“类型:脑部MRI”开始,其余部分以NaN开始。等等。

在读取txt文件时,导入似乎是将我定义的分隔符(“|”)和原始txt中的选项卡作为分隔符。没有'|'在报告的文本中。

有没有办法以将“考试编号:A5678”和“[报告结束]”之间的所有信息折叠到一个单元格(每行中的最后一个单元格)的方式导入此文件。

或者,我正在考虑将其预处理为文本文件,以便以迭代的方式提取所有报告文本,并将它们附加到我最终能够作为列添加到df的列表中。在网上和SO上看,当我需要使用唯一的开头(“考试编号:”)和结束(“[报告结束]”)分隔符时,我找不到这样做的方法。同时找到一种方法让脚本继续读取它停止的文本(而不是仅提取第一个报告文本)。

有什么想法吗?

谢谢! 玛雅

2 个答案:

答案 0 :(得分:1)

请注意您的[report_end]是否一致。您同时提供了[report_end][report end]。我假设这是一个错字。

假设您的文件名为test.txt

txt = open('test.txt').read()

names, txt_ = txt.split('\n', 1)
names = names.split('|')

pd.DataFrame(
    [t.strip().split('|') for t in txt_.split('[report_end]') if t.strip()],
    columns=names)

          Name     MRN           DOB   Type_Imaging   Report_Status                                         Report_Text
0     John Doe    1234    01/01/1995            MRI        Complete    Exam Number: A5678\nReport status: final\nTyp...
1  James Smith    5678    05/05/1987             CT        Complete   Exam Number: A8623\nReport status: final\nType...

答案 1 :(得分:0)

我最终做了这个有用的工作:

    import re
    import pandas as pd

    f = open("filename.txt", "r”)
    data = f.read().replace("\n", “”)
    matches = re.findall("\|Exam Number:(.*?)\[report_end\]", data, re.DOTALL)

    df= pd.read_csv("filename.txt", sep="|", parse_dates=[5]).dropna(axis=0, how="any”)