2017-06-20 17 views
1

プロパティアドレスと各プロパティの複数の属性を含む文字列で構成されるPythonリストがあります。リスト対vsクラス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', ... 

これは1つの「エントリ」です。リストは、フィールドが空のまま残っていると完全にスキップされても、残りのプロパティ(「Date of Sale」で始まります)によって同じパターンで続きます。たとえば、入札が行われなかった場合、「入札金額」に金額ではなく「その他」が直接表示されます。

目的は、情報を簡単に解析できるようにすることです。たとえば、入札していないすべてのプロパティを一覧表示したいとします。

主な問題は、データフォーマットが使用するものです(class、リスト、辞書、またはデータフレーム):

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

が、私は複数のプロパティに関する情報を取得するためにこれを利用することになるかわかりませんよ。

OR

1つのlist項目に各プロパティに関するすべての情報を結合します。私はあなたがこの情報をどのように見ているかわかりません。

OR

それは簡単にいずれかの時に反復思えませんが、アドレスによってキー、および他のすべての情報価値をdictionaryを使用してください。

OR

パンダdataframeを活用します。より多くの研究をする必要がありますが、「スプレッドシート」データはその形式でうまく機能するようです。

+0

あなたの例のデータは、ように見えますエラーがあります: '' Number of Windows ''キーに関連する値はありません。それは、あなたが試みたパースを破る可能性があります。 – Blckknght

+0

あなたのお返事ありがとうございます@Blckknght私はより良いコメントを追加する必要があります。たとえキーがあっても、エントリの中にはそれらに関連付けられた値が含まれていないものがあります。いずれのフィールドにも答えがない場合(この場合は「windows」)、リストの次の項目は単に次のキーになります。最終的には、リスト内のいずれかのキーの値を持たないすべてのアドレスを見つけることが目標です。 – Coby

答えて

2

あなたのデータの現在の構造は非常に厄介なので、私はあなたがそれを分解し、各エントリの辞書を作ることから始めることをお勧めします。辞書のリストをあとでもっと洗練された別のデータ構造(たとえばDataFrame)に処理することもできますが、まず低レベルの処理を行う方が簡単です。ここで

あなたはdictsのリストに、文字列のあなたの単一の長いリストを変換することができます方法は次のとおりです。

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 

私は全然パンダを経験していないんだけど、私はあなたのリストからデータフレームを作ることができます疑います(おそらく、リストを引数としてDataFrameコンストラクタに渡すことで、わかりません)。特に、すべての項目にすべての列の値がない場合は、データに含めると予想されるすべての列を記述する余分な引数を渡す必要があります。

+0

ありがとうございます。あなたは欠けている値をどのように扱いますか? – Coby

+0

ああ、値が足りないと言ったときに、そのキーのデータがないと、キーと値の両方が含まれないということを意味すると私は考えました。それが欠けている値ならば、反復子の繰り返しで 'zip'を使った私のアプローチはまったく機能しません。前もってキーの名前をすべて知っていて、それぞれの値が次のキーの名前であるかどうかを確認する必要があります。それは本当に面倒です。リストの生成方法を制御できますか?あなたが何かを解析しているなら、それほど難しいことがないより早い段階で状況を修正できるかもしれません。 – Blckknght

+0

このようなものはどうですか? キーの場合は 、キーの場合はzip(* [iter(raw_data)] * 2):#生のリストのアイテムのペアを反復する キー==「発売日」の場合: current_dict = { }#値が==「販売日」、「電話番号」、「色」、または「ガレージサイズ」の場合は、販売日キー に出会うたびに新しいディクテーションを作成します。#残りのキーの略号: value = ''#次のキーでスキップしたり順序が狂ったりするのではなく、繰り返し続けますか? list_of_dicts.append(current_dict) current_dict [key] = value' – Coby

0

実際にデータ分析(KISSの原理)を行う必要がない限り、私はPandas 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]