2017-12-15 7 views
2

ライブラリusaddressを使用して、私が持っているファイルのセットからアドレスを解析しています。最終的な出力は、列名が住所の一部(例:ストリート、シティ、州)を表し、行は抽出した個々の住所を表すデータフレームになります。たとえば:並べ替えられていないタプルのリストをパンダに変換するDataFrame

addr = ['123 Pennsylvania Ave NW Washington DC 20008', 
     '652 Polk St San Francisco, CA 94102', 
     '3711 Travis St #800 Houston, TX 77002'] 

と私は

info = [usaddress.parse(loc) for loc in addr] 

「情報」は、このように見えるタプルのリストのリストであるがUSAddressという使用してそれらを抽出します。

は、私はアドレスのリストを持っていると仮定します:

[[('123', 'AddressNumber'), 
    ('Pennsylvania', 'StreetName'), 
    ('Ave', 'StreetNamePostType'), 
    ('NW', 'StreetNamePostDirectional'), 
    ('Washington', 'PlaceName'), 
    ('DC', 'StateName'), 
    ('20008', 'ZipCode')], 
[('652', 'AddressNumber'), 
    ('Polk', 'StreetName'), 
    ('St', 'StreetNamePostType'), 
    ('San', 'PlaceName'), 
    ('Francisco,', 'PlaceName'), 
    ('CA', 'StateName'), 
    ('94102', 'ZipCode')], 
[('3711', 'AddressNumber'), 
    ('Travis', 'StreetName'), 
    ('St', 'StreetNamePostType'), 
    ('#', 'OccupancyIdentifier'), 
    ('800', 'OccupancyIdentifier'), 
    ('Houston,', 'PlaceName'), 

私は各リストを希望します(ob 「info」)と、タプルペアの1の値を値とする各タプルペアの2つの値とを含む。注:インナーリストのリンクは、すべてのアドレスがすべての情報を持っているわけではないため、必ずしも同じではありません。

ご協力いただければ幸いです。

おかげ

+0

これは、リストのタプルが順序付けされていないか、またはまばらなのです。 'OccupancyIdentifier'は3番目の項目にのみ現れ、それは2回現れるので、(value、key)の単純なリストではないので、複数の隣接するサブ値を連結しなければなりません – smci

答えて

1

はあなたをありがとう反応!

ドキュメントをチェックして、可能なすべてのparse_tagsをusaddressから確認し、可能なすべてのタグを列として、抽出した1つの列に抽出したアドレスを含むDataFrameを作成しました。その後、私は、regexを使って列から情報を解析し抽出しました。下のコード!

parse_tags = ['Recipient','AddressNumber','AddressNumberPrefix','AddressNumberSuffix', 
'StreetName','StreetNamePreDirectional','StreetNamePreModifier','StreetNamePreType', 
'StreetNamePostDirectional','StreetNamePostModifier','StreetNamePostType','CornerOf', 
'IntersectionSeparator','LandmarkName','USPSBoxGroupID','USPSBoxGroupType','USPSBoxID', 
'USPSBoxType','BuildingName','OccupancyType','OccupancyIdentifier','SubaddressIdentifier', 
'SubaddressType','PlaceName','StateName','ZipCode'] 

addr = ['123 Pennsylvania Ave NW Washington DC 20008', 
     '652 Polk St San Francisco, CA 94102', 
     '3711 Travis St #800 Houston, TX 77002'] 

df = pd.DataFrame({'Addresses': addr}) 
pd.concat([df, pd.DataFrame(columns = parse_tags)]) 

は、その後、私はusaddress解析リストの中から文字列を作り、「情報」

df['Info'] = df['Addresses'].apply(lambda x: str(usaddress.parse(x))) 

が今ここに主要な回避策があります、それを呼ばれる新しい列を作成しました。私は各列名をループし、対応する "Info"セルでそれを探し、正規表現を適用して、存在する場所の情報を抽出しました!

for colname in parse_tags: 
    df[colname] = df['Info'].apply(lambda x: re.findall("\('(\S+)', '{}'\)".format(colname), x)[0] if re.search(
    colname, x) else "") 

これはおそらく最も効率的な方法ではありませんが、私の目的のために働いています。みなさん、ありがとうございました!

2

あなたは今それを持っているように、正確にinfoを扱うことができるデータフレームのコンストラクタがある場合はわかりません。 (?。多分from_recordsまたはfrom_items - まだ、この構造は、直接互換性があるとは思わない)

ここでの操作のビットは、あなたが探しているものを取得することです:

cols = [j for _, j in info[0]] 

# Could use nested list comprehension here, but this is probably 
#  more readable. 
info2 = [] 
for row in info: 
    info2.append([i for i, _ in row]) 

pd.DataFrame(info2, columns=cols) 

    AddressNumber StreetName StreetNamePostType StreetNamePostDirectional PlaceName StateName ZipCode 
0   123 Pennsylvania    Ave     NW  Washington  DC 20008 
1   652   Polk     St     San  Francisco,  CA 94102 
関連する問題