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

2024-05-23 16:49:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

下面是一个简略示例,说明一个应用程序的状态更改/注释是什么样子的

Abridged view for one application

正文遵循一些基本模式

一般性意见: 当前_人员(姓名)填写日期:text

志愿者的变化: 当前_人员(姓名)填写日期:将表格分配给新_人员(最后一名)

表格状态更改: 当前_人员(名字)在日期写入:状态从当前_状态更改为新_状态

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

Possible result

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

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

我是否应该继续使用python和re?还是有更好的方法来获得我所描述的?我坚信有一个更好的方法,我只是知道的还不够多

非常感谢您的建议

更新

样本数据here in CSV filehere in XML file

您将在其中找到四个名称: 珍妮·怀特, 罗丝·伯克, 克里·詹姆斯, 亨利·伍兹

我意识到文本CSV文件并不像我想象的那样干净。注释或状态更改之间没有空格。尽管有模式,但并不总是一致的(只有名字和全名)。我更新了模式。通过导出到CSV,您将看到以下内容

亨利于2020年9月22日写道:将表格交给罗斯·伯克 Rose在2020年9月22日写道:发送了介绍电子邮件

变成

亨利于2020年9月22日撰文:分配给罗斯·伯克罗斯的表格于2020年9月22日撰文:发送介绍电子邮件

现在,我还需要更多地考虑清理数据。 谢谢你看


Tags: csv数据方法in文本应用程序表单here
1条回答
网友
1楼 · 发布于 2024-05-23 16:49:22

所以我想出了如何使用正则表达式来处理基于模式的注释

接下来的一个可以获取所有不同的日期和所有状态,因为它们都有“更改的状态来源”部分,我可以将单个组与旧状态或新状态进行匹配

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文件

相关问题 更多 >