Dataframes vergleichen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
KrisCrow
User
Beiträge: 11
Registriert: Dienstag 10. August 2021, 13:00

Hallo miteinander,

ich habe zwei DataFrames, welche unterschiedlich gestalltet sind (aus csv geladen):

Code: Alles auswählen

df1 = pandas.DataFrame(data = {'ID1' : [1, 2, 3, 4, 5], 'ID2' : ['A', 'B', '', 'D']}) 
df2 = pandas.DataFrame(data = {'ID2' : [E, F, 5])
Das df1['ID1'] soll nach Werten von df2['ID2'] durchsucht werden und wenn es eine Übereinstimmung gibt soll der Wert aus df1['ID2'] in df2['ID2'] übernommen werden.

Das Ergebnis soll folgendes sein:

Code: Alles auswählen

df2 = 'ID2' : E, F, D
Wie mache ich das, ohne Schleifen?

Vielen Dank!
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist keine Übernahme, sondern eine unklare Vermengung beider Einträge. Solange diese Vorschrift nicht klar definiert ist, kommt man nicht weiter.
KrisCrow
User
Beiträge: 11
Registriert: Dienstag 10. August 2021, 13:00

__deets__ hat geschrieben: Dienstag 10. August 2021, 13:26Das ist keine Übernahme, sondern eine unklare Vermengung beider Einträge. Solange diese Vorschrift nicht klar definiert ist, kommt man nicht weiter.
Danke für deine Antwort, aber Sorry, ich verstehe nur Bahnhof, was du meinen könntest.

df2['ID2'][2] == 5 und df1['ID1'][4] == 5 ==> deshalb df2['ID2'][2] = df1['ID2'][4]
ist für mich ganz klar und eindeutig definiert!?

Es gibt zwei Ausgabeprogramme (von Simulationsergebnissen). Programm für df1 verwendet zwei IDs in zwei Zeilen. Das Programm von df2 verwendet ebenfalls dieselben beiden IDs, aber mal die eine, mal die andere (nach einem Schema, das tut hier aber nicht zur Sache und ist auch nicht relevant).
Ich möchte aber nur eine einzige ID verwenden und deshalb soll nach Übereinstimmungen gesucht werden und dies so ersetzt werden.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist der Eintrag aus df2

'ID2' : [E, F, 5]

Das der aus df1:

'ID2' : ['A', 'B', '', 'D']

Das der den du erzeugen willst:

'ID2' : E, F, D

Der entspricht weder dem ersten, noch dem zweiten. Und was du mit Übereinstimmung meinst, ist eben nicht klar definiert. Wo in deinem ersten Beitrag steht denn bitte, dass man nicht nur auf den Schlüssel, sondern auch den Wert schauen soll? Und warum auf den Index 2? Wo steht das? Und wie kommt es zur Synthese eines Eintrags, der eine Kombination darstellt?

Ist alles nicht beschrieben gewesen, und immer noch nicht klarer geworden.

Nachtrag: jetzt erst gesehen, dass du ja sogar noch ID1 ins Spiel bringst. Das macht es ja noch undurchsichtiger.

Vielleicht bin ich zu blöd, aber da ist eben nichts klar. Vielleicht würde es da, wenn du echte Daten zeige würdest, weiß ich nicht. Wenn du einen Methode hast, die Daten zu kombinieren, dann kannst du auch die zeigen.
KrisCrow
User
Beiträge: 11
Registriert: Dienstag 10. August 2021, 13:00

Sorry, mein Fehler:

Code: Alles auswählen

df1 = pandas.DataFrame(data = {'ID1' : [1, 2, 3, 4, 5], 'ID2' : ['A', 'B', '', '', 'D']}) 
df2 = pandas.DataFrame(data = {'ID2' : [E, F, 5])
Das zweite leere Feld hat in df1['ID2'] gefehlt. (kann den Beitrag oben nicht mehr editieren)
Alles andere ist exakt so wie oben geschrieben.
KrisCrow
User
Beiträge: 11
Registriert: Dienstag 10. August 2021, 13:00

__deets__ hat geschrieben: Dienstag 10. August 2021, 14:01Wenn du einen Methode hast, die Daten zu kombinieren, dann kannst du auch die zeigen.
So funktioniert es einwandfrei und genauso, wie ich es möchte ... leider sehr sehr langsam:

Code: Alles auswählen

import pandas as pd
from tqdm import tqdm

df1 = pd.DataFrame(data = {'ID1' : [1, 2, 3, 4, 5], 'ID2' : ['A', 'B', '', '', 'D']})
df2 = pd.DataFrame(data = {'ID2' : ['E', 'F', 5]})
print(df1)
print(df2)

with tqdm(total=len(df2)) as pbar:
    for n in range(len(df2)):
        for z in range(len(df1)):
            if df2['ID2'].iloc[n] == df1["ID1"].iloc[z]:
                df2['ID2'].iloc[n] = df1["ID2"].iloc[z]
        pbar.update(n)

print(df1)
print(df2)
Wie geht das ohne Schleifen?
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Es wäre schon, wenn du funktionierende Beispiele posten würdest. Dann müssen Leute, die dir helfen wollen, nicht erst im Code rumwerkeln. Oben (Post von 10.08.21 15:19 und Eingangspost) fehlen eine Klammer und 2 * "" um die Strings.
Das hier sollte zumindest mit deinen Beispieldaten funktionieren:

Code: Alles auswählen

import pandas as pd
df1 = pd.DataFrame(data = {'ID1' : [1, 2, 3, 4, 5], 'ID2' : ['A', 'B', '', '', 'D']})
df2 = pd.DataFrame(data = {'ID2' : ['E', 'F', 5]})
merged = df2.merge(right=df1, left_on="ID2", right_on="ID1", how="left")
mask = ~merged.ID2_y.isna()
df2.ID2[mask] = merged.ID2_y[mask]
KrisCrow
User
Beiträge: 11
Registriert: Dienstag 10. August 2021, 13:00

Super, vielen lieben Dank. Das ist genau das, was ich möchte.
Wie das funktioniert verstehe ich gerade noch nicht, aber für den Anfang langt es :D
einfachTobi hat geschrieben: Mittwoch 11. August 2021, 08:20Es wäre schon, wenn du funktionierende Beispiele posten würdest.
Das konnte ich wie geschrieben leider nicht mehr ergänzen oder ändern. Nächstes mal mache ich das aber gleich :wink:
Antworten