使用 Python 进行数据标准化

Data normalization with Python

这是最终将加载到 MySQL 数据库的 csv 文件示例。问题是数据未规范化,因为 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_idroute 作为列 headers 并且每行只有 1 条路线.我已经尝试将 un-normalized csv 导入 MySQL 数据库,但无法实用地对其进行规范化。在导入到数据库之前在 Python 中提供的任何帮助将不胜感激。

获取重要的列

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 插入语句。

这将为每条路线创建一行。如果您希望所有路线都在一行中,您可以 fiddle 使用内部 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()