DatenFrames vergleichen und ausgeben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

Hallo Zusammen,

ich hoffe das ist die richtige stelle im Forum. :)

Ich habe zwei Dateien (eine CSV und eine XLSX), welche ich in DataFrames einlese. Zunächst werden diese von mir nach für mich wichtige spalten sortiert. Nun stehen in beiden Dateien Seriennummer und vereinzelt können diese übereinstimmen. Diese möchte ich ausfindig machen.

Hier mein Code dazu.
import pandas as pd
df_umbau = pd.read_excel("Sensoren_test.xlsx",
header=0,
sheet_name=1,
)

df_nummer = pd.read_csv("Sensoren_Gesamt.csv",
sep=';',
decimal=',',
header=0,
dtype={"Modus": object})

#Datenframes richtig Konfektionieren

df_nummer = df_nummer[(df_nummer['Telefon'] == 'D1 Telekom')]

df_nummer = df_nummer[['Sensor','Modus','Telefon']]

df_umbau = df_umbau[(df_umbau['Sensor\n Typ'] == 'MTP')]

df_umbau = df_umbau[['Rufnummer\nNEU','Rufnummer\n ALT','Sensor\nNEU (MTP)']]


#Daten Filtern

with df_filter as pd.DataFrame():
for line in df_umbau:
if line in df_nummer:
df_filter = line



Das Sortieren klappt super. Nur bei meinem Versuch diese zu Filtern, sagt er das die Funktion nicht bekannt ist. Ich mache sicherlich etwas Falsch. :D :D

Vielen Dank im Voraus für Tipps

Gruß
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

Ich habe noch mal rum getüftelt. Jetzt bekomme ich keine Fehlermeldung mehr...aber er gibt mir nur den DataFrame (df_Filter) ohne Inhalt wieder.

Liegt das daran, dass die Spalten überall unterschiedlich heißen? und somit nicht vergleichen werden kann?

Hier der Code:

import pandas as pd
df_umbau = pd.read_excel("Sensoren_test.xlsx",
header=0,
sheet_name=1,
)

df_nummer = pd.read_csv("Sensoren_Gesamt.csv",
sep=';',
decimal=',',
header=0,
dtype={"Modus": object})

#Datenframes richtig Konfektionieren

df_nummer = df_nummer[(df_nummer['Telefon'] == 'D1 Telekom')]

df_nummer = df_nummer[['Sensor','Modus','Telefon']]

df_umbau = df_umbau[(df_umbau['Sensor\n Typ'] == 'MTP')]

df_umbau = df_umbau[['Rufnummer\nNEU','Rufnummer\n ALT','Sensor\nNEU (MTP)']]


#Daten Filtern

df_filter = pd.DataFrame(columns=['Rufnummer Neu', 'Rufnummer Alt', 'MTP'])

for line in df_umbau:
if line in df_nummer:
df_filter.write(line)


print(df_filter)
Das Bekomme ich zurück:


Empty DataFrame
Columns: [Rufnummer Neu, Rufnummer Alt, MTP]
Index: []
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Modus soll wohl vom Typ String sein?
Seit wann hat ein DataFrame eine write-Methode? for-Schleifen braucht man bei Pandas selten. Was willst Du da eigentlich machen?
Für konkrete Hilfe brauchen wir natürlich auch Beispieldaten.
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

Sirius3 hat geschrieben: Sonntag 7. Februar 2021, 20:34 Modus soll wohl vom Typ String sein?
Seit wann hat ein DataFrame eine write-Methode? for-Schleifen braucht man bei Pandas selten. Was willst Du da eigentlich machen?
Für konkrete Hilfe brauchen wir natürlich auch Beispieldaten.
Vielen Dank für die Antwort. Ich werde morgen Beispiele nachreichen.

Vor ab... Habe ich zwei DataFrames

In beiden stehen Sensoren mit Seriennummer und Telefonnummern.

Ich will die Seriennummer aus df_nummern - > 'Sensoren' mit den Seriennummern aus df_umbau - > 'Sensor\nNEU (MTP)' vergleichen.

Alle identischen Treffer aus beiden df's in df_filter ausgeben.

Also quasi

'Sensor' 'Modus' 'Telefon' | 'Rufnummer\nNEU','Rufnummer\n ALT','Sensor\nNEU (MTP)'


Ich werde aber morgen noch mal Beispiel Daten anfügen. :)
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Was soll da den sonst drinne stehen

Code: Alles auswählen

df_filter = pd.DataFrame(columns=['Rufnummer Neu', 'Rufnummer Alt', 'MTP'])
erzeugt einen Datenframen mit lediglich den Spaltennamen die angegeben wurden jedoch ohne einen einzigen Wert drinne ???
Eine Vision ohne Aktion bleibe eine Illusion
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Seppel90: Du könntest in der Dokumentation nach den Abschnitten schauen wo parallelen zu SQL gezogen werden. Denn wenn ich das richtig verstehe willst Du so etwas wie einen JOIN über die Tabellen haben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

Bl3nder hat geschrieben: Sonntag 7. Februar 2021, 23:24 Was soll da den sonst drinne stehen

Code: Alles auswählen

df_filter = pd.DataFrame(columns=['Rufnummer Neu', 'Rufnummer Alt', 'MTP'])
erzeugt einen Datenframen mit lediglich den Spaltennamen die angegeben wurden jedoch ohne einen einzigen Wert drinne ???
Meine Idee war einen leeren DatenFrame zu erstellen, wo die Werte eingelesen werden.
__blackjack__ hat geschrieben: Sonntag 7. Februar 2021, 23:30 @Seppel90: Du könntest in der Dokumentation nach den Abschnitten schauen wo parallelen zu SQL gezogen werden. Denn wenn ich das richtig verstehe willst Du so etwas wie einen JOIN über die Tabellen haben.
Das werde ich mal machen danke...

Das Problem ist ja, dass ich bei meiner Recherche schon auf Lösungen gestoßen bin, allerdings basieren die alle darauf das die Data Frames gleich groß sind.

Ich habe aber Gesamt 265 Seriennummer und im Umbau nur 205.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Das scheint mir alles etwas strubbelig. Idealerweise liest man nur das ein, was man auch benötigt, statt das nach dem Einlesen wieder auszusortieren. Dafür gibt es "usecols" bei read_csv und read_excel.
Kannst du uns mal kleine Beispieldatensätze geben, die so aussehen, wie die echten Daten? Dann noch die Info, welche Daten du benötigst und was das Endergebnis sein soll.
Ich vermute fast, dass es mit einer einer Zuweisung a la

Code: Alles auswählen

df_sensoren["umbau"] = df_sensoren["id"].isin(df_umbau["id"])
getan sein könnte. Oder willst du, wie vorgeschlagen, die beiden DataFrames joinen?
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

einfachTobi hat geschrieben: Montag 8. Februar 2021, 11:52 Das scheint mir alles etwas strubbelig. Idealerweise liest man nur das ein, was man auch benötigt, statt das nach dem Einlesen wieder auszusortieren. Dafür gibt es "usecols" bei read_csv und read_excel.
Kannst du uns mal kleine Beispieldatensätze geben, die so aussehen, wie die echten Daten? Dann noch die Info, welche Daten du benötigst und was das Endergebnis sein soll.
Ich vermute fast, dass es mit einer einer Zuweisung a la

Code: Alles auswählen

df_sensoren["umbau"] = df_sensoren["id"].isin(df_umbau["id"])
getan sein könnte. Oder willst du, wie vorgeschlagen, die beiden DataFrames joinen?
Ersteinmal vielen Dank an alle und eure Ratschläge. Ich finde das ist ein super Forum hier. :)

Also....

Sensoren_test.xlsx

Bild

Sensoren_Gesamt.csv

Bild

Also ich möchte final die Seriennummern aus der "Sensoren_test.xlsx" Spalte "Sensoren NEU (MTP)" mit denen aus "Sensoren_Gesamt.csv" Spalte "Sensor" vergleichen. Wenn es eine Übereinstimmung gibt soll die Rufnummer aus "Sensoren_Gesamt.csv" Spalte "Modus" in das leere Feld von "Sensoren_test.xlsx" Spalte "Rufnummer Neu" geschrieben werden und alle Änderungen in einen separaten Data Frame gespeichert werden.

Problem:
In "Sensoren_Gesamt.csv" sind mehr Sensoren als in "Sensoren_test.xlsx" vorhanden. Außerdem sind die Tabellen nicht sortiert also stehen die Einträge an unterschiedlichen stellen. :)


Ich wollte mich halt Schritt für Schritt an die Lösung heran arbeiten.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

So wird doch ein Schuh draus. Dann suchst du DataFrame.merge()

Code: Alles auswählen

neu  = df_nummer.merge(df_umbau, left_on="Sensor\nNEU (MTP)", right_on="Sensor")
Die Spaltennamen musst du natürlich anpassen, sofern sie nicht passen - das lese ich gerade nicht so schnell raus.
Beispielcode:

Code: Alles auswählen

import pandas as pd
sensoren = pd.DataFrame({"Rufnummer_alt": [586397444, 852368845, 123456789], "sensor_alt": [454, 835, 12], "sensor_neu": [521, 856, 123]})
umbau = pd.DataFrame({"sensor": [521, 757, 123], "modus": [1234567899, 9568789996, 789456123], "provider": [True, True, False]})
neu = sensoren.merge(umbau, left_on="sensor_neu", right_on="sensor")
print(sensoren)
print(umbau)
print(neu)
Standard ist ein "inner join". Das Verhalten kannst du natürlich anpassen: Ein Blick in die Doku zeigt wies geht.
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

einfachTobi hat geschrieben: Dienstag 9. Februar 2021, 08:47 So wird doch ein Schuh draus. Dann suchst du DataFrame.merge()
.
.
.
.
Vielen Dank für deinen Tipp. Das hört sich schon einmal sehr gut an. Ich habe es direkt bei mir getestet und zunächst folgende Meldung zurück bekommen...
ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
Als nächstes habe ich dann "sensor_neu" und "sensor" als object deklariert. Jetzt bekomme ich keine Fehlermeldung mehr. Allerdings wird mir anschließend nur ein leerer DataFrame zurückgegeben (Empty DataFrame Columns: ........ ).

Ich werde mir noch mal die Doku zu rate ziehen. :)
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Seppel90: Du musst natürlich schon schauen das die Werte in beiden Tabellen den gleichen Typ haben und nicht in einem Zahlen und im anderen Zeichenketten sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Seppel90
User
Beiträge: 25
Registriert: Mittwoch 3. Februar 2021, 13:28

__blackjack__ hat geschrieben: Dienstag 9. Februar 2021, 22:38 @Seppel90: Du musst natürlich schon schauen das die Werte in beiden Tabellen den gleichen Typ haben und nicht in einem Zahlen und im anderen Zeichenketten sind.
Jetzt klappt es so wie ich mir das vorgestellt habe.

Musste aber die CSV-Datei auch als Excel abspeichern, anders war es mir nicht möglich beide Spalten den gleichen Typ zu zu zuweisen.


Vielen Dank noch mal an alle die Mitgewirkt haben. :)
Antworten