繁体   English   中英

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

[英]How do I add information from one CSV file to another based off of matching values in Python?

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

这是我想要添加信息的 CSV 文件的图像:我想要添加到的表

这是我想解析信息的 CSV 文件的图像,然后将缺少的信息添加到连接的 CSV 文件中:我想从中获取信息的表

这就是我希望我的 CSV 文件最终看起来的样子:所需的结果

我只是简单地复制并粘贴到此处来演示我的目标,但是我有大量数据要通过对照源表进行检查来添加。

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

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

我的代码迭代的次数超出了我的预期。 我希望它只是比较我调用的字典值。

#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)

你们建议我做什么来完成将新数据合并到现有值的任务? 我是在正确的轨道上还是偏离了方向? 如果您有任何问题,或者我可以提供更多信息,请告诉我。 我希望我说的有道理。

如果您想继续在本机 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM