2 Dateien/Tabellen mergen/vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

Hallo, ich hab da mal ne Frage. Ich hab da schon einiges Probiert, bin aber nicht weitergekommen.

Fakten:
Ich habe 2 Tabellen die jeweils unterschiedliche sowie auch gleich Spaltenbezeichnungen haben und auch unterschiedlich lang sind. Desweiteren ist die 1. Spalte beider Tabellen eine ID. In beiden Tabellen gibt es gleiche und unterschiedliche IDs.

bsp.
Tabelle1/Datei1

V1 V2 V3 V4 V5
ID1 aa nn zz ii
ID2 ss rr oo ll
ID4 qq mm öö pp
ID5 nn vv bb xx
...
...


Tabelle2/Datei2

V1 V2 V3 V4 V5 V6
ID1 aa nn zz ii 45
ID3 ff xx yy tt 45
ID4 qq mm öö pp 45
ID6 uu kk nn ff 45
ID7 qq ww ee rr 45
...
...




Das Problem ist nun:
Nach einer bestimmten Tabelle sollen die IDs gemerged werden, so das dann von allen IDs in der einen Tabelle die Spalten herausgefiltert werden, die auch in der anderen anderen Tabelle vorhanden sind. Die einzelnen Zeilen sollen quasi aktualisiert werden. Hier werden ID1 und ID4 aus Tabelle 1 "aktualisiert".

Bsp. Ergebniss:

V1 V2 V3 V4 V5 V6
ID1 aa nn zz ii 45
ID2 ss rr oo ll
ID4 qq mm öö pp 45
ID5 nn vv bb xx
...
...


Zum Schluss müssten dann jeweiles die Zeilen angeben werden (komplett) die nicht mit gemerged wurden. Das heisst die nur in Tabelle 1 vorhanden waren und andersherum die nur in Tabelle 2 vorhanden waren. Vlt auch noch mir Zeilenanzahl,
z.B.

45 Zeilen wurden nicht gemerged in Tabelle 1:
ID2 ss rr oo ll
ID5 nn vv bb xx
...

30 Zeilen wurden nicht gemerged in Tabelle 2:
ID3 ff xx yy tt 45
ID6 uu kk nn ff 45
ID7 qq ww ee rr 45
...

Hat da einer ne Idee womit ich das am besten realisieren kann? Die Tabellen können übrigens einige tausend Zeilen lang sein.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Chibi hat geschrieben:Ich hab da schon einiges Probiert, bin aber nicht weitergekommen.
Was denn so? Ansätze?

Grundsätzlich ist das Modul `numpy` geeignet, um mit Matrizen-artigen Daten umzugehen. Allerdings ist es eher auf Zahlen und das Rechnen damit ausgelegt. Aber es mag dennoch nützlich sein; ich kenne mich damit nicht so aus.

Das hier musst Du noch mal präzise erklären:
Chibi hat geschrieben: Das Problem ist nun:
Nach einer bestimmten Tabelle sollen die IDs gemerged werden, so das dann von allen IDs in der einen Tabelle die Spalten herausgefiltert werden, die auch in der anderen anderen Tabelle vorhanden sind. Die einzelnen Zeilen sollen quasi aktualisiert werden. Hier werden ID1 und ID4 aus Tabelle 1 "aktualisiert".

Bsp. Ergebniss:

V1 V2 V3 V4 V5 V6
ID1 aa nn zz ii 45
ID2 ss rr oo ll
ID4 qq mm öö pp 45
ID5 nn vv bb xx
...
...
Wird hier eine neue Tabelle erstellt oder Tabelle 1 nur mit Daten aus Tabelle 2 erweitert? Wie wird das definiert? Wie wird definiert, welche IDs aktualisiert werden sollen? Wie werden leere Attribute repräsentiert? Kann es solche überhaupt geben?

Ich könnte mir vorstellen, dass man `collections.namedtuple` hier nutzen könnte.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ergänzend nachgefragt: Welche Attribute werden denn übernommen? Werden alle Attribute aus beiden Tabellen übernommen? (Aus Deinem Beispiel würde ich das schließen, aber oben im Text schreibst Du etwas von "Tabellen haben gleiche und verschiedene Spaltenbezeichnungen".

Was würde mit

Code: Alles auswählen

Tabelle 1:
KEY V2 V3 V4
... .. .. ..

Tabelle 2:
KEY V3 V4 V5
... .. .. ..
passieren?
Würden alle Attribute übernommen?

Code: Alles auswählen

Tabelle Merged:
KEY V2 V3 V4 V5
In Deinem Beispiel hatte Tabelle 2 ja einfach eine Spalte mehr - hier haben beide Tabellen eine Spalte, die die jeweils andere Tabelle nicht hat.

Wie wird entschieden, welcher Wert aus einer Spalte, die bei beiden Tabellen vorhanden ist, übernommen wird? Im Beispiel: Welche Werte der Spalten V3 und V4 stehen im Resultat? (das könnte sich an meine obige Frage anschließen / korreliert sein, ob eine neue Tabelle erstellt, oder eine bestehende erweitert wird).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Chibi: sind die Daten in deinen Tabellen zeilenweise oder spaltenweise organisiert? Die sprichst von Zeilen mergen aber Daten spaltenweise vergleichen...

Gruß, noisefloor
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

@ Hyperion
Wird hier eine neue Tabelle erstellt oder Tabelle 1 nur mit Daten aus Tabelle 2 erweitert? Wie wird das definiert? Wie wird definiert, welche IDs aktualisiert werden sollen? Wie werden leere Attribute repräsentiert? Kann es solche überhaupt geben?
Wird hier eine neue Tabelle erstellt oder Tabelle 1 nur mit Daten aus Tabelle 2 erweitert?
Es wird die Tabelle 2 an Tabelle 1 gemerged, es entsteht keine neue Tabelle! Nur eine "Aktualisierung" der Tabelle 1

Wie wird das definiert? Wie wird definiert, welche IDs aktualisiert werden sollen?
Wie werden leere Attribute repräsentiert? Kann es solche überhaupt geben?
Es wird einfach geschaut ,ob die ID in der ersten Spalte, gleich ist! Ist sie gleich, werden alle Spalten aktualisiert/angehängt, die auch in Tabelle 2 vorhanden sind. (Tabelle 1 hat z.B. 5 Spalten und Tabelle 2 = 6), also müssen alle Zeilen in Tabelle 1 dann später auch eine 6.Spalte bekommen und gibt es in Tabelle 1 fehlende Daten (werden immer mit NA gekennzeichent) werden diese mit den entsprechenden Daten aus Tabelle 2 ersetzt. Und ja, es kann auch fehlende Daten geben ;-)

z.B. Tabelle1/Datei1

V1 V2 V3 V4 V5
ID1 aa nn zz ii
ID2 ss NA NA ll
ID4 qq mm öö pp
ID5 nn vv NA xx



@ noisefloor

Ich denke Zeilenweise organisiert und müssen halt anhand der ID in der ersten Spalte verglichen werden, so meinte ich das.

@all

sry für die blöde Beschreibung :oops:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Keine Ahnung, ob ich das abschließend wirklich alles verstanden habe, aber hier mal etwas auf die Schnelle. Die Ausgabeformatierung muss man ggf. noch verbessern:
Link
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

oO, ohman vielen Dank, ich werd das mal ausprobieren und berichten. Mega Danke für diese Mühe :shock:
Antworten