使用 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_id
和 route
作为列 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()
这是最终将加载到 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_id
和 route
作为列 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()