【问题标题】:Data normalization with Python使用 Python 进行数据规范化
【发布时间】:2015-02-02 18:16:12
【问题描述】:

这是一个 csv 文件示例,最终将加载到 MySQL 数据库中。问题是数据没有标准化,因为routes 列中有多个值。

stop_id,on_street,cross_street,routes,boardings
49,HARRISON,PAULINA,"126, 755",1.6
50,ASHLAND,CONGRESS,"9,126",14.8
51,ASHLAND,VAN BUREN,"9,126",100.9
52,JACKSON,1900 W.(MALCOLM X COLL.),126,82.8

我想将 routes 列提取到一个新的 csv 文件中,其中 stop_id 和 route 作为列标题,并且每行只有 1 个路由。我已经尝试将未规范化的 csv 导入 MySQL 数据库,但无法实用地对其进行规范化。在导入数据库之前在 Python 中执行此操作的任何帮助将不胜感激。

【问题讨论】:

  • 你想如何规范化?路线中的每个项目都应该是单独的行吗?也就是说,49,HARRISON,PAULINA,"126, 755",1.6 会变成两行,49, 126 和 49, 775?
  • @tdelaney 也可以,有什么建议吗?在原始帖子中,我提到将routes 列提取到新的 csv 文件中
  • @Anconia - 你提到将routes 提取到route,我只是在寻找一些澄清。将所有路线保持在同一行或每行只有一条路线很容易。
  • @tdelaney 啊哈我明白了 - 我很抱歉没有提到在新的 routes 列中每行应该只有 1 个 route。 OP 已更新 :-)

标签: python csv database-normalization


【解决方案1】:

这将为每条路线创建一行。如果你想要一行中的所有路由,你可以使用内部 for 循环。

import csv
import re

sample = """stop_id,on_street,cross_street,routes,boardings
49,HARRISON,PAULINA,"126, 755",1.6
50,ASHLAND,CONGRESS,"9,126",14.8
51,ASHLAND,VAN BUREN,"9,126",100.9
52,JACKSON,1900 W.(MALCOLM X COLL.),126,82.8"""

open('sample.csv','w').write(sample)

with open('sample.csv') as sample, open('output.csv','w') as output:
    reader = csv.reader(sample)
    writer = csv.writer(output)
    # discard input header
    next(reader)
    # write output header
    writer.writerow(['stop_id', 'route'])
    # process rows
    for row in reader:
        if row:
            for route in re.split(r', *', row[3].replace('"', '')):
                writer.writerow([row[0], route])


print open('output.csv').read()

【讨论】:

    【解决方案2】:

    获取重要的列

    def get_interesting_columns():
        import csv
        with open("stuff","r") as f:
            oReader = csv.reader(f)
            next(oReader) # get rid of titles line. 
                          # comment it out if you want the headings too
            for l in oReader:
                yield l[0],l[-2]
    

    您可以使用该生成器创建另一个 csv 文件。

    或者你可以使用 SQLAlchemy 之类的东西来使用 python 来执行你需要的 sql 插入语句。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2020-07-31
      • 1970-01-01
      • 2018-12-12
      • 2013-06-30
      • 2012-04-06
      • 2016-05-17
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多