it-swarm.com.de

Zusammenführen von zwei CSV-Dateien mit Python

OK, ich habe hier einige Threads über Stack Overflow gelesen. Ich dachte, das wäre ziemlich einfach für mich, aber ich finde, dass ich Python immer noch nicht sehr gut verstehe. Ich habe das Beispiel unter ausprobiert, wie man 2 csv-Dateien mit einem gemeinsamen Spaltenwert kombiniert, aber beide Dateien haben eine unterschiedliche Anzahl von Zeilen und das war hilfreich, aber ich immer noch habe nicht die ergebnisse, die ich mir erhofft hatte.

Im Wesentlichen habe ich 2 CSV-Dateien mit einer gemeinsamen ersten Spalte. Ich möchte die 2. zusammenführen, d.h.

filea.csv

 Titel, Bühne, Januar, Februar 
 verdammt, 3.001.0.421.0.532 
 OK, 2.829.1.036.0.751 
 Drei, 1.115.1.146.2.921 

fileb.csv

 Titel, März, April, Mai, Juni, 
 verdammt, 0,631,1,321,0,951,1,751 
 OK, 1,001,0,247,2,456,0,3216 
 Drei, 0,285,1,283,0,924,956 

output.csv (nicht die, die ich bekomme, aber was ich will)

 titel, bühne, jan, feb, märz, apr, mai, juni 
 darn, 3.001.0.421.0.532.0.631.1.321.0.951.1.751 
 ok, 2.829.1.036 0,751,1,001,0,247,2,456,0,3216 
 Drei, 1,115,1,146,2,921,0,285,1,283,0,924,956 

output.csv (die Ausgabe, die ich tatsächlich bekam)

 Titel, Februar, Mai 
 OK, 0,751,2,456 
 Drei, 2,921,0,924 
 Darn, 0,532,0,951 

Der Code, den ich versuchte:

'''
testing merging of 2 csv files
'''
import csv
import array
import os

with open('Z:\\Desktop\\test\\filea.csv') as f:
    r = csv.reader(f, delimiter=',')
    dict1 = {row[0]: row[3] for row in r}

with open('Z:\\Desktop\\test\\fileb.csv') as f:
    r = csv.reader(f, delimiter=',')
    #dict2 = {row[0]: row[3] for row in r}
    dict2 = {row[0:3] for row in r}

print str(dict1)
print str(dict2)

keys = set(dict1.keys() + dict2.keys())
with open('Z:\\Desktop\\test\\output.csv', 'wb') as f:
    w = csv.writer(f, delimiter=',')
    w.writerows([[key, dict1.get(key, "''"), dict2.get(key, "''")] for key in keys])

Jede Hilfe wird sehr geschätzt.

20
Rex

Wenn ich mit csv Dateien arbeite, benutze ich oft die pandas Bibliothek. Es macht solche Dinge sehr einfach. Beispielsweise:

import pandas as pd

a = pd.read_csv("filea.csv")
b = pd.read_csv("fileb.csv")
b = b.dropna(axis=1)
merged = a.merge(b, on='title')
merged.to_csv("output.csv", index=False)

Es folgt eine Erklärung. Zuerst lesen wir in den CSV-Dateien:

>>> a = pd.read_csv("filea.csv")
>>> b = pd.read_csv("fileb.csv")
>>> a
   title  stage    jan    feb
0   darn  3.001  0.421  0.532
1     ok  2.829  1.036  0.751
2  three  1.115  1.146  2.921
>>> b
   title    mar    apr    may       jun  Unnamed: 5
0   darn  0.631  1.321  0.951    1.7510         NaN
1     ok  1.001  0.247  2.456    0.3216         NaN
2  three  0.285  1.283  0.924  956.0000         NaN

und wir sehen, dass es eine zusätzliche Datenspalte gibt (beachten Sie, dass die erste Zeile von fileb.csv - title,mar,apr,may,jun, - hat ein extra Komma am Ende). Wir können das leicht genug loswerden:

>>> b = b.dropna(axis=1)
>>> b
   title    mar    apr    may       jun
0   darn  0.631  1.321  0.951    1.7510
1     ok  1.001  0.247  2.456    0.3216
2  three  0.285  1.283  0.924  956.0000

Jetzt können wir a und b in der Titelspalte zusammenführen:

>>> merged = a.merge(b, on='title')
>>> merged
   title  stage    jan    feb    mar    apr    may       jun
0   darn  3.001  0.421  0.532  0.631  1.321  0.951    1.7510
1     ok  2.829  1.036  0.751  1.001  0.247  2.456    0.3216
2  three  1.115  1.146  2.921  0.285  1.283  0.924  956.0000

und schreibe dies endlich aus:

>>> merged.to_csv("output.csv", index=False)

produzieren:

title,stage,jan,feb,mar,apr,may,jun
darn,3.001,0.421,0.532,0.631,1.321,0.951,1.751
ok,2.829,1.036,0.751,1.001,0.247,2.456,0.3216
three,1.115,1.146,2.921,0.285,1.283,0.924,956.0
60
DSM

Sie müssen alle zusätzlichen Zeilen in den Dateien in Ihrem Wörterbuch speichern, nicht nur eine davon:

dict1 = {row[0]: row[1:] for row in r}
...
dict2 = {row[0]: row[1:] for row in r}

Da es sich bei den Werten in den Wörterbüchern um Listen handelt, müssen Sie die Listen einfach zusammenfügen:

w.writerows([[key] + dict1.get(key, []) + dict2.get(key, []) for key in keys])
1
Xymostech