【问题标题】:Python: Match values between two csv filesPython:匹配两个 csv 文件之间的值
【发布时间】:2016-11-30 22:09:56
【问题描述】:

我正在解析两个不同的 csv 文件,需要匹配它们之间的列。目前,当我运行 sn-p 时,它不返回匹配值,而实际上两个 csv 文件之间存在匹配的地址。我遇到的问题是 OnlineData csv 文件中地址字段的缩写。例如:

In the Addresses csv                             In the OnlineData csv
  4587 Newton Road                                    4587 Newton Rd
  7854 Food Court                                     7854 Food Ct

如何告诉 Python 在查找时查找两个 csv 文件中的数字 ('4587') 和第一个单词 ('Newton')匹配值。

import csv


Addresses = set()

with open ('Addresses.csv') as f:
    for row in csv.reader(f):
        Addresses.add(row[1])

OnlineData = set()

with open ('C:/Users/OnlineData.csv') as g:
    for row in csv.reader(g):
        PermitData.add(row[1])


results = Addresses & OnlineData


print 'There are', len(results), 'matching addresses between the two csv files'

for result in sorted(results):
    print result

【问题讨论】:

  • 不要添加完整的row[1] 值,而是先在每个循环中截断它,以便在尝试交叉之前删除RoadRdCourt 等组件。跨度>
  • 如果这听起来很荒谬,我很抱歉,但您的意思是使用 append 吗?
  • 我会写一个解决方案。

标签: python python-2.7 csv


【解决方案1】:

由于您只对匹配数据的部分感兴趣,您不妨将该部分加载到set,然后执行交集。

import csv

Addresses = set()
with open ('Addresses.csv') as f:
    for row in csv.reader(f):
        portion = ' '.join(row[1].split()[:-1])  # Loads "4587 Newton" instead of "4587 Newton Road"
        Addresses.add(portion)

OnlineData = set()
with open ('C:/Users/OnlineData.csv') as g:
    for row in csv.reader(g):
        portion = ' '.join(row[1].split()[:-1])
        OnlineData.add(portion)

results = Addresses & OnlineData

print 'There are', len(results), 'matching addresses between the two csv files'

for result in sorted(results):
    print result

明显的缺点是您丢失了仍然可以检索的那部分信息。另一种选择是规范化输入,这意味着您可以将Rd 替换为Road,并将Ct 替换为Court,以便始终获得匹配的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多