簡體   English   中英

使用 Python 從文本(在 CSV 文件中)中提取數據

[英]Extracting data from text (in CSV file) with Python

我正在幫助一個狗救援小組分析他們收到的收養申請。 所有的申請都通過一個在線系統提交,每個申請都有一個自動生成的表格 ID。 然后將申請分配給不同的志願者進行處理。

大多數信息都很簡單,我可以使用 Pandas 輕松處理。 部分分析是關於每個申請的處理時間。 這意味着從申請創建之日起(表格狀態為“已提交”)到狗被采用(表格狀態為“已采用”)。 當我導出表單數據時,狀態更改和一般評論混合在一個名為“評論(內聯)”的標題下。

以下是一個應用程序的狀態更改/評論的縮略示例。

一個應用程序的縮略視圖

文本遵循一些基本模式。

一般評論:CURRENT_PERSON(名字)寫於 DATE:文本

志願者的變化:CURRENT_PERSON(名字)寫於 DATE:分配表格給 NEW_PERSON(first last)

表單狀態更改:CURRENT_PERSON(名字)寫於 DATE:已將狀態從 CURRENT_STATUS 更改為 NEW_STATUS

我是 python 的新手(~3mos)。 首先想到的是使用python和正則表達式來解析文本,提取數據,並將它們分成兩組(一組用於一般評論,一組用於狀態更改)。 這將需要一些時間,因為我仍在學習,但這似乎是可行的。 最終結果將是這樣的。

可能的結果

可以多次分配相同的狀態,因此我需要給它們一個編號。 然后我可以將處理時間計算為 Adapted-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 日寫道:發送介紹電子郵件。

現在我還需要更多地考慮清理數據。 謝謝參觀。

所以我想出了如何使用正則表達式來處理基於模式的評論。

下面這個可以獲取所有不同的日期和所有狀態,因為它們都有“更改狀態自”部分,我可以將單個組與舊狀態還是新狀態進行匹配。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM