簡體   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