【问题标题】:Data cleaning in a csv file using python使用 python 清理 csv 文件中的数据
【发布时间】:2018-03-26 11:19:39
【问题描述】:

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

10515, 115th Place Northeast, Juanita, Kirkland, King County, Washington, 98033, 美国

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

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

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

3008, 38th Avenue Southwest, West Seattle, Seattle, King County, Washington, 98126, 美国

23098, Northeast 130th Street, Trilogy, Union Hill-Novelty Hill, Novelty, King County, Washington, 98053, 美国

Fire Station 34, 633, 32nd Avenue East, Broadmoor, Washington Park, Seattle, King County, Washington, 98112, 美国

基本上,并非每条记录都会包含全部 10 种信息,也不一定顺序相同。

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

我正在使用 Python 2.0。

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

【问题讨论】:

  • 老实说,这类问题通常是通过支付人脑来清理数据来解决的。即使您为此数据集提出了解决方案,您将如何检测它何时中断并提交只有人类才能识别的不良数据?如果人必须在之后修复它,那么人类不妨先修复它。
  • 没错,但提到的问题可以通过自动化在更大程度上解决,然后最终手动解决错误。只是试图减少这将需要的手动工作量。考虑我要求的解决方案作为过滤器,以尽可能多地正确获取数据。希望这是有道理的“)
  • 这是假设您的清理工作不只是引入大量难以发现或微妙的意外错误,这些错误对于人类来说更难理解。显然,这是一种权衡。有多少数据与如何接受引入的错误,以及其他标准。但是与现在使用的各种“大”数据集相比。大多数(例如)城市街道数据的错误率很高,因为没有好的方法可以自动清理。

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


【解决方案1】:

我会使用库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 中。

【讨论】:

  • usaddress,不是usaaddress(一个A,不是2)
  • 我使用 usaddress 并得到如下输出 - (OrderedDict([('AddressNumber', '10515'), ('StreetName', '115th'), ('StreetNamePostType', 'Place' ), ('StreetNamePostDirectional', 'Northeast'), ('Recipient', 'Juanita, Kirkland, King County, Washington, 98033, United States')]), 'Street Address') .... 它没有分裂根据代码中显示的属性。以一个标签为Recipient,放入多种信息。
  • 另外,它最终会抛出一个错误说 - RepeatedLabelError: ERROR: Unable to tag this string because more of the area have the same label
  • 使用 usaddress.parse(),我得到以下输出 - [('10515,', 'AddressNumber'), ('115th', 'StreetName'), ('Place', ' StreetNamePostType'), ('Northeast,', 'StreetNamePostDirectional'), ('Juanita,', '收件人'), ('Kirkland,', '收件人'), ('King', '收件人'), ('县,', '收件人'), ('Washington,', '收件人'), ('98033,', '收件人'), ('United', '收件人'), ('States', '收件人'), ('of', 'Recipient'), ('America', 'Recipient')] ..........知道为什么会这样这个?
  • 这可能是另一个问题的主题。
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2021-03-23
  • 2019-08-15
相关资源
最近更新 更多