2017-10-23 1 views
0

重複する情報を含む2つのファイル(csv1とcsv2)があります。一致する箇所がある場合は、列の値をcsv2からcsv1にコピーしたい。 CSV1の凝集バージョンのCSVの複数の列に一致します。 1つのCSVから他のCSVに値をコピーする場合

empid, name, org, division, title, country, topic, time-on-topic 

CSV2種類が、の形で:

org, country, topic, rating 

は、new_csvは、所望の結果であるマイ:

CSV1は、の形態であります

empid, name, org, division, title, country, topic, time-on-topic, rating 

基本的に、csv1とcsv2の間に 'country'と 'topic'が一致する場合は、関連付けられた 'rating'をコピーします。 o csv1構造体を新しいファイルcsv3に変換します。辞書、タプル、リストを使ってメッセージボードを検索するのに多くの時間を費やしたことを認めて恥ずかしくて、これまではキーとして1つの列しか使用していないと機能しません。 2列をキーとして使用できますか?あるいは私は間違った質問をしていますか?

これは私がこれまでやってますが、キーとして「EMPID」でてきたものです:

with open('csv1.csv', 'r') as f: 
    first = {rows[0]: rows[1:] for rows in list(csv.reader(f))} 

with open('csv2.csv', 'r') as f: 
    for row in csv.reader(f): 
     if row[0] in first: # row[0] = url 
      first[row[0]].append(row[2]) 

merged = [(k,) + tuple(v) for k, v in first.items()] 

with open('output.csv', 'w') as f: 
    csv.writer(f).writerows(merged) 

私は私の問題の核心は、キーとして2つの列を使用していると思いますが、私はわかりませんあるケースでは、複数の列をキーとして使用することがあります。何とかキーを作成するために列を連結する必要がありますか?以下は

+0

は、データセットにCSVをインポート検討(のStata/SAS、Rのデータフレーム、偶数のPythonパンダのデータフレーム)またはデータベース(SQLiteの/ MS AccessはファイルレベルのDBMSである)と2つの新しい割り当てられた列の参加/マージ。ループは必要ありません。 – Parfait

答えて

0

私はデータフレームの使用に関して、pd.merge()に基づいて以下のスクリプトを実装しました。

df1 = pd.read_csv('csv1.csv') 
df2 = pd.read_csv('csv2.csv') 
result = pd.merge(df1, df2, on = ['empid', 'name', 'org', 'division', 'title', 'country', 'topic', 'time-on-topic'], how = 'right') 
result.to_csv("output.csv") 
0

あなたが望んでいた何をすべきいくつかのコードです:

COUNTRY_CSV1, TOPIC_CSV = 5, 6 

with open('csv1.csv', 'r') as f: 
    first = {(rows[COUNTRY_CSV1], rows[TOPIC_CSV1]): 
      rows for rows in list(csv.reader(f))} 

COUNTRY_CSV2, TOPIC_CSV2, RATING_CSV2 = 1, 2, 3 
with open('csv2.csv', 'r') as f: 
    for row in csv.reader(f): 
     key = row[COUNTRY_CSV2], row[TOPIC_CSV2] 
     first.get(key, []).append(row[RATING_CSV2] 

with open('output.csv', 'w') as f: 
    csv.writer(f).writerows(first.values()) 

質問からメイン論理変更は、ここで我々はnbeing特定の2組とキー(ように2つの組を使用することです国、トピック、要請)。

しかし、他のクリーンアップもあります - 行を分割して再マップするのではなく、値の "キー"部分も保持します。この冗長性により、書込みコードがはるかに簡単になります。

インデックスは、どのフィールドが必要なのかを明確にするために定数に変更されました。最後に、if文がgetメソッド呼び出しに置き換えられ、新しいリストが返されます。これは間違ったオーバーヘッドのようですが、これは遅い(Pythonのパフォーマンスが変わっても速いかもしれませんが)エラーは起こりにくいでしょう。

+0

ありがとう!私は概念的に理解していると私はそのような初心者ですので、私はスクリプトを実行しようとすると、私は7行目の行に無効な構文エラー(csv.reader(f))の行を取得します。 ... "どんなアイデアなの? – imstuck

関連する問題