2016-07-26 7 views
0

2つのcsvファイルを共通のid列にマージし、新しいファイルにマージを書き込もうとしています。私は、次のことを試してみましたが、それは私にエラーを与えている -一般的な列のPythonで2つのCSVファイルをマージする

import csv 
from collections import OrderedDict 

filenames = "stops.csv", "stops2.csv" 
data = OrderedDict() 
fieldnames = [] 
for filename in filenames: 
    with open(filename, "rb") as fp: # python 2 
     reader = csv.DictReader(fp) 
     fieldnames.extend(reader.fieldnames) 
     for row in reader: 
      data.setdefault(row["stop_id"], {}).update(row) 

fieldnames = list(OrderedDict.fromkeys(fieldnames)) 
with open("merged.csv", "wb") as fp: 
    writer = csv.writer(fp) 
    writer.writerow(fieldnames) 
    for row in data.itervalues(): 
     writer.writerow([row.get(field, '') for field in fieldnames]) 

両方のファイルは、「stop_id」欄があるが、私は戻って、このエラーを取得しています - KeyError例外:「stop_id」

すべてのヘルプをだろう大変感謝しています。ここで

おかげ

+0

'data.setdefault(row [" stop_id "]、{})。update(row)' - なぜとても複雑なのですか? – Alleo

+0

また、2つのテーブルをカラムごとにマージするには、 'pandas.merge'を使います。http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational -algebra – Alleo

+0

これに入力として別のスタックオーバーフローの例を使用しました。代替案を提案できますか?ありがとう – sgpbyrne

答えて

0

おかげ四条を使用した例です。

これは、各csvの最初の列で後でマージされたものです。

import csv 
from collections import OrderedDict 

with open('stops.csv', 'rb') as f: 
    r = csv.reader(f) 
    dict2 = {row[0]: row[1:] for row in r} 

with open('stops2.csv', 'rb') as f: 
    r = csv.reader(f) 
    dict1 = OrderedDict((row[0], row[1:]) for row in r) 

result = OrderedDict() 
for d in (dict1, dict2): 
    for key, value in d.iteritems(): 
     result.setdefault(key, []).extend(value) 

with open('ab_combined.csv', 'wb') as f: 
    w = csv.writer(f) 
    for key, value in result.iteritems(): 
     w.writerow([key] + value) 
1

はパンダ

import sys 
from StringIO import StringIO 
import pandas as pd 

TESTDATA=StringIO("""DOB;First;Last 
    2016-07-26;John;smith 
    2016-07-27;Mathew;George 
    2016-07-28;Aryan;Singh 
    2016-07-29;Ella;Gayau 
    """) 

list1 = pd.read_csv(TESTDATA, sep=";") 

TESTDATA=StringIO("""Date of Birth;Patient First Name;Patient Last Name 
    2016-07-26;John;smith 
    2016-07-27;Mathew;XXX 
    2016-07-28;Aryan;Singh 
    2016-07-20;Ella;Gayau 
    """) 


list2 = pd.read_csv(TESTDATA, sep=";") 

print list2 
print list1 

common = pd.merge(list1, list2, how='left', left_on=['Last', 'First', 'DOB'], right_on=['Patient Last Name', 'Patient First Name', 'Date of Birth']).dropna() 
print common 
関連する問題