Dataframes 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
Pokerbrille
User
Beiträge: 2
Registriert: Freitag 5. Mai 2023, 14:22

Hi zusammen,

ich habe 2 dataframes mit je 2 Spalten: 'Name' und 'Dosis_monatx'.
Ich würde gerne ein neues df_gesamt erzeugen, welches mir alle Namen auflistet (nicht doppelt) und um die Spalten der Monate ergänzt.
Da die Werte aus 2 verschiedenen Monaten stammen, sind in dem einen df nicht zwingend die gleichen Personen gelistet wie in dem anderen.

Ich hab die Daten aus Exceltabellen eingelesen, aber hier mal exemplarisch was gemeint ist:
dosimetrie1 = {'Name': ['Aaron', 'Barbara', 'Davis', 'Konrad'],
'Dosis_monat1': [1, 0, 1.2, 0]}
df_monat1 = pd.DataFrame(dosimetrie1)
dosimetrie2 = {'Name': [ 'Barbara', 'Carolin', 'Davis' ],
'Dosis_monat2': [1, 0, 1]}
df_monat2 = pd.DataFrame(dosimetrie2)

############################################
df_monat1:
Name Dosis_monat1
Aaron 1
Barbara 0
Davis 1.2
Konrad 0

df_monat2:
Name Dosis_monat2
Barbara 1
Carolin 0
Davis 1

rauskommen soll dann sowas: (Alphabetisch geordnet wäre natürlich hübsch, aber kriege ich dann schon selbst hin)
df_gesamt:
Name Dosis_monat1 Dosis_monat_2
Aaron 1 nan
Barbara 0 1
Carolin nan 0
Davis 1.2 1
Konrad 0 nan

Also falls mir da einer von euch helfen könnte, wäre ich euch sehr dankbar :)



LG Pokerbrille
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst df.join oder df.groupby
Benutzeravatar
ThomasL
User
Beiträge: 1377
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Schon mal irgendwann in die Pandas Doku geschaut?

https://pandas.pydata.org/pandas-docs/s ... Frame.html

Da steht jede Methode anwendbar auf Dataframes detailliert erklärt mit Beispielen.
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
Pokerbrille
User
Beiträge: 2
Registriert: Freitag 5. Mai 2023, 14:22

mit df.join hat es eben nicht funktioniert. Allerdings habe ich das Problemchen soweit anders gelöst.

Ich habe beiden eine 3. Spalte gegeben, um nachher identifizieren zu können, aus welcher Datei welche Zeile kam, dann zusammengefügt (pd.merge) und anschließend die doppelten rausgelöscht (geht bestimmt eleganter, aber es funktioniert :) ):

def check_duplicates (index, df):
oberes = df.at[index, 'Name']
unteres = df.at[index+1, 'Name']
return oberes == unteres

def fusion_month(df1, df2):
l_1 = len(df1['Name'])
l_2 = len(df2['Name'])

for index1 in range(l_1):
df1.at[index1, 'Monat'] = 1
for index2 in range(l_2):
df2.at[index2, 'Monat'] = 2

df_new = pd.merge(df1,df2, how="outer", sort=['Name'])
l_new = len(df_new['Name'])

for i in range(l_new): # schleife prüft wo doppelte Namen auftauchen und entfernt diese
if i == l_new-1:
break
else:
if check_duplicates(i,df_new):
if df_new.at[i, 'Monat'] == 1:
df_new.at[i, 'Dosis_monat2'] = df_new.at[i+1,'Dosis_monat2']
df_new.at[i+1, 'Dosis_monat1'] = df_new.at[i,'Dosis_monat1']
else:
df_new.at[i+1, 'Dosis_monat2'] = df_new.at[i,'Dosis_monat2']
df_new.at[i, 'Dosis_monat1'] = df_new.at[i+1,'Dosis_monat1']

df_new = df_new.drop_duplicates(subset=['Name']) # löscht die doppelten Namen raus
del df_new['Monat'] # löscht Spalte 'Monat'
return df_new
Benutzeravatar
ThomasL
User
Beiträge: 1377
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Also bei mir klappt das mit .join() und sortiert ist es auch.

Code: Alles auswählen

import numpy as np
import pandas as pd

dosimetrie1 = {'Name': ['Konrad', 'Aaron', 'Barbara', 'Davis'], 'Dosis_monat1': [0, 1, 0, 1.2]}
monat1 = pd.DataFrame(dosimetrie1)
dosimetrie2 = {'Name': ['Davis', 'Barbara', 'Carolin'], 'Dosis_monat2': [1, 1, 0]}
monat2 = pd.DataFrame(dosimetrie2)

monat = monat1.set_index('Name').join(monat2.set_index('Name'), how='outer')
monat

Code: Alles auswählen

Dosis_monat1	Dosis_monat2
Name		
Aaron	1.0	NaN
Barbara	0.0	1.0
Carolin	NaN	0.0
Davis	1.2	1.0
Konrad	0.0	NaN
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
Antworten