2017-06-20 86 views
1

我有一個Python列表組成的字符串包含屬性地址和每個屬性的多個屬性。列表與字典vs類與DataFrame在Python數據格式化

'Date of Sale', 'January 1, 2017', 'Phone Number', '111-344-2343', 'Color', 'Brown', 'Garage Size', '2', 'Date Listed', 'September 23, 2016', 'Loan From', 'Example Mortgage Services', 'Street Address', '751 Example Drive', 'City', 'Chicago', 'Number of Windows', 'Attorney', 'Shaping LLP', 'Township', 'Dundee', 'Zip Code', '99999', 'List Price', '$83,301.87', 'Bid Amount', '$110,199.00', 'Miscellaneous', 'Long Driveway', 'Date of Sale', ... 

這是一個「入口」。該列表通過其餘屬性(每個以'銷售日期'開始)以相同的模式繼續,但如果字段留空,它們將被完全跳過。例如,如果沒有出價「出價金額」,則直接跟隨「雜項」,而不是金額。

目標是能夠輕鬆解析信息。例如,我想列出所有我沒有出價的物業。

的主要問題是什麼數據格式使用(class,列表,字典,或數據幀):

class Property(object): 
    def __init__(self,dateOfSale,phoneNumber...): 
     self.dateOfSale = 'dateOfSale' 
     self.phoneNumber = 'phoneNumber' 
     ... 

,但我不確定我會怎麼利用這個來獲得對多個屬性信息。

OR

組合關於每個屬性的所有信息到一個list項目。我不知道你如何看待這個信息。

OR

使用dictionary被解決的關鍵,和所有其他信息的價值,儘管這似乎並不在任何容易重複。

OR

利用熊貓dataframe。我將不得不做更多的研究,但似乎「電子表格」數據在這種格式下運作良好。

+0

你的榜樣數據似乎有一個錯誤:沒有與''Number of Windows''鍵關聯的值。這很可能會破壞你對它的任何解析。 – Blckknght

+0

感謝您的回覆@Blckknght我應該添加更好的評論。有些條目不包含與它們相關的值,即使有一個鍵。如果任何字段沒有答案(在本例中爲「windows」),則列表中的下一個項目將僅僅是下一個項目。最終,目標是能夠找到列表中沒有其中一個鍵的值的所有地址。 – Coby

回答

2

數據的當前結構非常尷尬,所以我建議您首先將其分解併爲每個條目製作字典。您稍後可以將字典列表處理爲另一個更復雜的數據結構(如DataFrame),但首先執行低級處理會更容易。

這裏是你如何能字串的單一長串轉換成的類型的字典列表:

raw_data = ['Date of Sale', 'January 1, 2017', 
      'Phone Number', '111-344-2343', 
      'Color', 'Brown', 
      'Garage Size', '2', 
      'Date Listed', 'September 23, 2016', 
      'Loan From', 'Example Mortgage Services', 
      'Street Address', '751 Example Drive', 
      'City', 'Chicago', 
      'Number of Windows', '16', # the value was missing for this key, so I made up one 
      'Attorney', 'Shaping LLP', 
      'Township', 'Dundee', 
      'Zip Code', '99999', 
      'List Price', '$83,301.87', 
      'Bid Amount', '$110,199.00', 
      'Miscellaneous', 'Long Driveway', 
      'Date of Sale', ...] # this is data for two entries (the second is abbreviated) 

list_of_dicts = [] 
for key, value in zip(*[iter(raw_data)]*2): # iterate on pairs of items from the raw list 
    if key == "Date of Sale": 
     current_dict = {} # create a new dict each time we come across a Date of Sale key 
     list_of_dicts.append(current_dict) 
    current_dict[key] = value 

我不是在所有與大熊貓經歷,但我懷疑你可以從列表中進行數據幀的字典很容易(也許只是通過將列表作爲參數傳遞給構造函數,我不確定)。您可能需要傳遞描述您希望數據包含的所有列的額外參數,特別是如果不是所有條目都具有所有列的值。

+0

謝謝。你將如何處理缺失的值? – Coby

+0

哦,我認爲當你說有些值丟失時,你的意思是如果沒有該鍵的數據,鍵和值都不會被包括在內。如果這只是缺少的值,那麼在重複迭代器上使用'zip'的上述方法根本不起作用。您需要提前知道密鑰的所有名稱,並檢查每個值是否是下一個密鑰的名稱。這真的很混亂。你有任何控制如何生成列表?如果你正在解析某些東西,你可能可以在較困難的時候解決這個問題。 – Blckknght

+0

這樣的事情呢?如果key ==「銷售日期」: 'list_of_dicts = [] for key,zip in value(* [iter(raw_data)] * 2):#對原始列表中的項目對進行迭代 : current_dict = { }#每當我們遇到銷售日期關鍵字 ,如果value ==「銷售日期」或「電話號碼」或「顏色」或「車庫大小」,則#創建一個新的字典...#將其餘的鍵縮小: value =''#我該如何繼續使用下一個鍵進行迭代,而不是跳過它併發生錯誤? list_of_dicts.append(current_dict) current_dict [key] = value' – Coby

0

除非你真的需要做數據分析(KISS原理),否則我不會去熊貓DataFrame。我可能會使用namedtuple的列表,而不是字典,因爲它是清潔的語法,如:

import csv 
from collections import namedtuple 
Property = namedtuple('Property', 'date_of_sale phone_number ...') 

properties = [] 
with open('propertydata.csv', newline='') as csvfile: 
    for record in csv.reader(csvfile): 
     properties.append(Property(*record)) 

然後你就可以遍歷性,做任何你需要:

no_bid_properties = [p for p in properties where not p.bid_amount]