使用python在csv文件中清理数据

时间:2017-10-14 12:59:48

标签: python pandas csv data-science data-cleaning

您好我正在处理一个包含多个列的csv文件。一个特定的列是地址,其格式如下 -

10515,115th Place Northeast,Juanita,Kirkland,King County,Washington,98033,United States of America

我想基于(,)拆分每一列,并为每个列创建新的相关列,例如单位,街道,州,邮政编码等......

我能够根据(,)拆分它们,现在每个拆分都有一列。

问题是这个数据不一致,我在拆分后获得的总列数是10.但是数据的顺序不一样。有些记录如下 -

3008,38th Avenue Southwest,West Seattle,Seattle,King County,Washington,98126,United States of America

23098,Northeast 130th Street,Trilogy,Union Hill-Novelty Hill,Novelty,King County,Washington,98053,United States of America

消防局34,633,32 Avenue Avenue East,Broadmoor,Washington Park,Seattle,King County,Washington,98112,United States of America

基本上,并非每条记录都包含所有10种信息,并且不一定按相同的顺序排列。

清理此类数据的最佳方法是什么?我想最终根据它们所代表的内容将数据放入相关列中,例如,如果城市列在城市列下,如果邮政编码移动到邮政编码列等。

我正在使用Python 2.0。

希望得到一个好的解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

我会使用库usaddress将地址分解为其组成部分。

https://usaddress.readthedocs.io/en/latest/

>>> import usaddress
>>> usaddress.tag('Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637')
(OrderedDict([
   ('BuildingName', 'Robie House'),
   ('AddressNumber', '5757'),
   ('StreetNamePreDirectional', 'South'),
   ('StreetName', 'Woodlawn'),
   ('StreetNamePostType', 'Avenue'),
   ('PlaceName', 'Chicago'),
   ('StateName', 'IL'),
   ('ZipCode', '60637')]),
'Street Address')

>>> usaddress.tag('State & Lake, Chicago')
(OrderedDict([
   ('StreetName', 'State'),
   ('IntersectionSeparator', '&'),
   ('SecondStreetName', 'Lake'),
   ('PlaceName', 'Chicago')]),
'Intersection')

>>> usaddress.tag('P.O. Box 123, Chicago, IL')
(OrderedDict([
   ('USPSBoxType', 'P.O. Box'),
   ('USPSBoxID', '123'),
   ('PlaceName', 'Chicago'),
   ('StateName', 'IL')]),
'PO Box')
从那里开始,您可以查询返回的字典并将其放入您的pandas DataFrame中。