使用 Python 从文本(CSV 文件中)提取数据

我正在帮助一个狗救援组织分析他们收到的收养申请。所有申请均通过在线系统提交,每个申请都会获得一个自动生成的表格 ID。然后,这些申请将被分配给不同的志愿者来处理。

大多数信息都很简单,我可以使用 pandas 轻松处理。分析的一部分是关于每个应用程序的处理时间。这意味着从申请创建之日(表格状态为“已提交”)到狗被收养(表格状态为“已收养”)。当我导出表单数据时,状态更改和一般注释混合在一个名为“注释(内联)”的标题下。

以下是一个应用程序的状态更改/评论的简短示例。

https://img4.mukewang.com/650967c4000157dd09580159.jpg

文本遵循一些基本模式。

一般评论:CURRENT_PERSON(名字)写于日期:文本

志愿者变更:CURRENT_PERSON(名字)于 DATE 写入:已将表格分配给 NEW_PERSON(名字)

表单状态更改:CURRENT_PERSON(名字)于日期写入:状态已从 CURRENT_STATUS 更改为 NEW_STATUS

我是 python 新手(~3mos)。我想到的第一件事是使用 python 和正则表达式来解析文本,提取数据,并将它们分为两组(一组用于一般注释,一组用于状态更改)。这需要一些时间,因为我仍在学习,但似乎是可行的。最终的结果将会是这样的。

https://img2.mukewang.com/650967cf0001c77706390043.jpg

相同的状态可以被分配多次,所以我需要给他们一个号码。然后我可以将处理时间计算为 Adopted-01 和 Submitted-01 之间的天数。

然而,从我到目前为止所了解到的情况来看,使用这种类型的迭代(for 循环)似乎很慢并且不推荐。到目前为止,我大约有 1500 份表格,而且这个数字只会增加。

我应该继续使用 python 和 re 吗?还是有更好的方法来获得我所描述的内容?我坚信有一种更好的方法,只是我还不够了解。

非常感谢您的建议。

更新

示例数据位于 CSV 文件中此处位于 XML 文件中

你会在那里找到四个名字:Jenny White、Rose Burk、Kerry James、Henry Woods。

我意识到文本 CSV 文件并不像我想象的那么干净。评论或状态更改之间没有空格。尽管存在模式,但并不总是一致(仅名字与全名)。我更新了模式。导出为 CSV 后,您将看到以下内容

Henry 于 2020 年 9 月 22 日写道:已将表格分配给 Rose Burk Rose 于 2020 年 9 月 22 日写道:已发送介绍电子邮件。

成为

Henry 于 2020 年 9 月 22 日写道:已将表格分配给 Rose BurkRose 于 2020 年 9 月 22 日写道:已发送介绍电子邮件。

现在我还需要更多地清理数据。谢谢参观。


湖上湖
浏览 70回答 1
1回答

互换的青春

所以我想出了如何使用正则表达式来根据模式处理注释。下面的这个可以获取所有不同的日期和所有状态,因为它们都有“更改状态”部分,并且我可以将各个组与旧状态还是新状态进行匹配。regex = r"(\d{1,2}\/\d{1,2}\/\d{4})\:\sChanged\sStatus\sfrom\s([A-Z][a-z]+(\s[a-z]+)?(\s[A-Z][a-z]+)?)\sto\s([A-Z][a-z]+(\s[a-z]+)?(\s[A-Z][a-z]+)?)"如果我只关注“领养”,这个就可以获取我需要的日期。regex = r"(\d{1,2}\/\d{1,2}\/\d{4})\:\sChanged\sStatus\sfrom\s([A-Z][a-z]+(\s[a-z]+)?(\s[A-Z][a-z]+)?)\sto\sAdopted(?!\sElsewhere)另外,我不需要使用 for 循环。在关注采用日期的特定情况下,我可以使用以下命令将采用日期添加到 Jupyter 笔记本中的数据框中。df['Adopted']=df['Comments (inline)'].str.extract(r'(\d{1,2}\/\d{1,2}\/\d{4})\:\sChanged\sStatus\sfrom\s[A-Z][a-z]+(\s[a-z]+)?(\s[A-Z][a-z]+)?\sto\sAdopted(?!\sElsewhere)')这也意味着我可以只使用原始 CSV 文件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python