Zwei Exceldateinen 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.
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

Hallo zusammen,
Ich bin der neue ;)
Ich hab jetzt ein paar Stunden verzweifelt versucht 2 Excel Datein miteinander zu vergleichen. Hier muss ich nur wissen ob alle Datensätze die in Datei A stehen auch denen aus Datei B und C entsprechen. Also B und C sollten zusammen alles enthalten was in A steht.
Dann kommt noch ein Problem mit der Formatierung dazu.
Datei B sieht so aus:

Nummer
12345678910

Datei A entspricht diesem Format :
Nummer
012345678910

Also müssten bei Datei A in der Datenreihe Nummer immer noch eine 0 vor die Ziffer gestellt werden.

Der Vergleich soll in Datei B und C alle Werte ausgeben die nicht in A vorhanden sind und bin Datei A alles zu dem kein Gegenstückin Datei B und C auffindbar war.

Ich hoffe das ich mein Problem gut Schildern konnte.

P.s
Alle Dateien Panda wurde initialisiert und alle Tabellen geladen.

Liebe Grüße
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe das Problem mit der führenden 0 nicht. Sind das Zeichenketten und keine Zahlen? Und soll A und B verschieden sein, weil das eine eine 0 hat und das andere nicht, oder sollen die trotz der 0 als gleich gelten?
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

In der .xls sind die führenden 0 vorhanden. Habe in Excel auch die Formatierung der Zellen schon geändert im Text Zahl oder sogar Sonderformatierung aber es funktioniert nicht.

Für mich sind die Zahlen mit oder ohne führende Null identisch. Mir kommt es auf den neuen Stellen nach der null an.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Was funktioniert nicht? Zeig doch mal den Code, den Du schon hast, und wo Du Probleme hast.
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

Kann ich leider erst am Montag, da ich den Rechner jetzt nicht bei mir hab.

Dann poste ich meinen Code und die Fehlermeldung die ich in dem Teil bekomme in dem ich vergleichen möchte.
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

So hier mein Code:

import pandas as pd

daten1 = pd.read_excel('Tabelle1.xls')
daten2 = pd.read_excel('Tabelle2.xls')
daten3 = pd.read_excel('Tabelle3.xls')
set.symmetric_difference(daten1^daten2)

Dazu kommt dann aus "set.symmetric_difference(daten1^daten2)"
"TypeError: ufunc 'bitwise_xor' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''"
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Bezüglich symmetric_difference schau mal hier https://www.programiz.com/python-progra ... difference
und bezüglich logischen Operationen auf Pandas Dataframes hier https://stackoverflow.com/questions/393 ... data-frame
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

ThomasL hat geschrieben: Montag 10. September 2018, 18:39 Bezüglich symmetric_difference schau mal hier https://www.programiz.com/python-progra ... difference

Danke, ich glaub aber es liegt irgendwo daran das ich die funktion nicht im DataFrame anwenden kann. Bekomme hier die Fehlermeldung ... AttributeError: 'DataFrame' object has no attribute 'symmetric_difference'

Das Problem mit der Führenden "0" habe ich gelöst bekommen. Irgendwie ging beim Import der Datentyp verloren. Hab jetzt alle Typen als object geladen. Kann das zu Problemen führen?
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

Ich sollte noch erwähnen das die Tabellen sich vom Aufbau etwas unterscheiden. Also möchte ich in der Tabelle B+C irgendwo die Werte finden aus Tabelle A und nur sehen welche Werte aus Tabelle A nirgends in Tabelle B + C zu finden sind.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Um Mengenoperationen durchzuführen brauchst Du erstmal Mengen. Und wenn die Dateien verschieden aufgebaut sind, dann mußt Du erstmal die relevanten Daten in die selbe Form bringen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Saar-Pfalz666: Wenn Du alles als `object` in den `DataFrame` lädst, dann frage ich mich warum Du das in einen `DataFrame` lädst. Zumal es ja anscheinend auch um Zahlen geht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

Sirius3 hat geschrieben: Montag 10. September 2018, 19:43 Um Mengenoperationen durchzuführen brauchst Du erstmal Mengen. Und wenn die Dateien verschieden aufgebaut sind, dann mußt Du erstmal die relevanten Daten in die selbe Form bringen.
Die Form sollte einigermaßen passen. Das Problem ist das die Daten nicht in der selben Reihenfolge auftreten. Ich kann auch nicht sicher sagen wie sie auftreten werden.

Die Funktion des Codes sollte am Schluss so sein, das ich 1 Master-File hab die sich mit 2 anderen vergleicht. Ganz egal wie die Daten in diesen Tabellen stehen. Es soll nur geprüft werden ob es ein gleiches Paar gibt.

So sehen die Ausgangsdaten in Excel aus:
TTNR Bezeichnung Startbestand Endbestand Zugänge Abgänge Endprodukt Durchschnittsbestand DLZ SummeBestand SummeAbgang Stufendurchschnitt Disponent Start Ende Tage
WW00R00 FORPART/ 236 90 0 146 4459 152,71 32,425 22125,978 56572 12,12446649 HCB 01.07.2018 31.07.2018 31
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

__blackjack__ hat geschrieben: Montag 10. September 2018, 20:03 @Saar-Pfalz666: Wenn Du alles als `object` in den `DataFrame` lädst, dann frage ich mich warum Du das in einen `DataFrame` lädst. Zumal es ja anscheinend auch um Zahlen geht.
Was wäre meine Alternative?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Saar-Pfalz666: Um ein Problem lösen zu können muss man es exakt beschreiben können. So etwas wie „Ich kann auch nicht sicher sagen wie sie auftreten werden.“ kann darauf hindeuten das man es nicht automatisiert lösen kann. Denn wenn Du das nicht weisst, und auch nicht exakt beschreiben kannst wie man es herausfinden kann wenn man total dämlich ist, denn das sind Rechner, wie soll der Rechner das Problem dann lösen?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

__blackjack__ hat geschrieben: Montag 10. September 2018, 20:46 @Saar-Pfalz666: Um ein Problem lösen zu können muss man es exakt beschreiben können. So etwas wie „Ich kann auch nicht sicher sagen wie sie auftreten werden.“ kann darauf hindeuten das man es nicht automatisiert lösen kann. Denn wenn Du das nicht weisst, und auch nicht exakt beschreiben kannst wie man es herausfinden kann wenn man total dämlich ist, denn das sind Rechner, wie soll der Rechner das Problem dann lösen?
Okay da gebe ich dir recht.
Gehen wir davon aus das die Daten gleich vorliegen nur in verschiedener Reihenfolge.
Wie würde ich einen solchen Vergleich anstellen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Saar-Pfalz666: Kommt ein bisschen darauf an was „vergleichen“ genau bedeutet. Wenn man wissen möchte ob die genau gleich sind, bis auf die Reihenfolge, dann kann man einfach beide Seiten des Vergleichs in die gleiche Reihenfolge bringen, also sortieren, und dann vergleichen. Wenn man wissen möchte wie die sich unterscheiden, sind Mengenoperationen ein Werkzeug.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

@_blackjack_ hab’s mir jetzt gerade nochmal angesehen. In der einen Datei sind mehr Zeilen als in der anderen.
Ich möchte nun die Zeilen finden die es nur in Datei1 gibt.
Dabei reicht es mir auch nur einzelne Spalten zu vergleichen, da es hier auch irrelevante Werte gibt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann packst Du die relevanten Spalten von Datei2 oder 3 am besten in ein Set, damit der Vergleich einfach wird und gehst alle Zeilen in Datei1 durch, und vergleichst, ob sie im Set sind.
Saar-Pfalz666
User
Beiträge: 16
Registriert: Freitag 7. September 2018, 14:00

import pandas as pd

import numpy as np

df1 = pd.read_excel('data.xls', 'Sheet1', na_values=['NA'], dtype=object)
df2 = pd.read_excel('hcc.xls', 'Sheet1', na_values=['NA'], dtype=object)
df3 = pd.read_excel('hck.xls', 'Sheet1', na_values=['NA'], dtype=object)

df4 = df2.append(df3, ignore_index=True)

df1.sort_values(by=['TTNR'])

df4.sort_values(by=['TTNR'])

df6 = df1.values

df7 = df4.values

df8 = set(df1.TTNR), set(df1.Abgänge), set(df1.Startbestand), set(df1.Zugänge), set(df1.Endbestand), set(df1.DLZ), set(df1.Durchschnittsbestand), set(df1.SummeBestand), set(df1.SummeAbgang), set(df1.Stufendurchschnitt), set(df1.Disponent)

df9 = set(df4.TTNR), set(df4.Abgänge), set(df4.Startbestand), set(df4.Zugänge), set(df4.Endbestand), set(df4.Durchlaufzeit), set(df4.Durchschnittsbestand), set(df4.SummeBestand), set(df4.SummeAbgang), set(df4.Stufendurchschnitt), set(df4.Disponent)

df8^df9

Da stecke ich jetzt fest und bekomme immer wieder eine Fehlermeldung (TypeError: unsupported operand type(s) for ^: 'tuple' and 'tuple'). Hab schon etliches versucht mittlerweile und mich durch unzählige Beiträge gelesen.

Das zwischen drin verwirrt vielleicht (df.values) und war nur ein Test ob es mit arrys funktioniert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte gewöhn dir mal sofort ab, Variablen durchzunummerieren. Das kann niemand anderes lesen und verstehen. Und niemand anderes bist auch du in 2 Wochen.

Die df8 und df9 sind Tupel. Alles was dem Muster

Code: Alles auswählen

x  = a, b, c
folgt, ist ein Tupel.

Ich vermute mal, das du statt einem Tupel mit Mengen eine Menge von Tupeln willst. Also

Code: Alles auswählen

df3682927263 = set(df127183819101.values)
sollte eigentlich klappen.
Antworten