如何根据Python中的匹配值将信息从一个CSV文件添加到另一个CSV文件?

时间:2018-05-15 20:37:18

标签: python excel csv join merge

我正在尝试将来自多个CSV文件的数据合并到一个CSV文件中。我有几个具有类似信息的文件。我想通过匹配相似的单元格数据并将缺少的信息附加到相应的行来将我不具备的信息添加到单个CSV文件中。

这是我要将信息添加到的CSV文件的图像: table I want to add to

这是我想要解析信息的CSV文件的图像,然后将缺少的信息添加到已加入的CSV文件中:table I want to take information from

这就是我希望我的CSV文件最终看起来像:desired result

我只是复制并粘贴在这里以展示我的目标,但是我想通过在源表中检查它来添加大量数据。

到目前为止,我的策略是使用CSV模块并创建一个嵌套的for循环,与两行进行比较。现在我的代码只是尝试查看两个表之间是否匹配而不尝试追加任何内容。这也证明是困难的。

到目前为止,我的输出如下所示:current output请注意,在此图片中,我尝试添加管理员信息,这就是输出显示名称而不是其他信息的原因

我的代码迭代超过我想要的。我希望它只是比较我调用的字典值。

#Python 3.6.4    
import csv
import codecs

count = 0
original_csv = codecs.open("Texas School Districts.csv", 'r', encoding='utf-8', errors='ignore')
fieldnames1 = ['NCES LEA ID', 'State ID', 'District Name']
reader1 = csv.DictReader(original, fieldnames=fieldnames1)

additional_info = codecs.open("new_information.csv", 'r', encoding='utf-8', errors='ignore')
fieldnames2 = ['Name', 'District', 'Type', 'Description']
reader2 = csv.DictReader(additional_info, fieldnames=fieldnames2)

for row1 in reader1:
    for row2 in reader2:
        if row1['District Name'] == row2['Name']:
            print(row1['District Name'], ":", row2['Name'])
        else:
            pass
    count += 1  
    original.seek(count)
    append.seek(0)

你们建议我做些什么来完成将新数据合并到现有值的任务?我是在正确的轨道还是我离开了?如果您有任何疑问,或者我可以提供更多信息,请与我们联系。我希望我有所了解。谢谢大家。

1 个答案:

答案 0 :(得分:0)

如果你想继续在原生python而不是pandas或真正的数据库中这样做,你来加快这段代码:

for row1 in reader1:
    for row2 in reader2:
        if row1['District Name'] == row2['Name']:
            print(row1['District Name'], ":", row2['Name'])
        # seek to avoid reader2 to be EOF ...
如果您事先构建查找set,则不需要第二个循环:

existing_names = {row["Name"] for row in reader2}

现在使用单个循环,无需回放文件:

for row1 in reader1:
    if row1['District Name'] in existing_names: # set lookup is faaast
            print(row1['District Name'])

现在代码在O(n)(平均值)与O(n**2)

之间运行