Spaltenwerte über DataFrame ändern

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
C#17
User
Beiträge: 19
Registriert: Montag 22. Mai 2017, 12:19

Hallo, ich stehe momentan komplett auf dem Schlauch.
Ich importiere zwei Excel listen mittels

Code: Alles auswählen

data1=pd.read_excel("Data_folder1.xlsx")
data2=pd.read_excel("Data_folder2.xlsx")
und wandle sie in ein DataFrame um.

Code: Alles auswählen

data1=pd.DataFrame(data1)
data2=pd.DataFrame(data2)
Die Beiden Listen haben jeweils eine Spalte "Artikel" und eine Spalte "EAN-Nummer".
Nun möchte ich ganz einfach den Werten der Spalte "Nummer" der Liste 2, die Nummern der Liste 1 zuweisen, wenn Name1==Name2. Dies soll nicht mittels einer Schleife gemacht werden sondern möglichst mittels Fancy indexing in der Form:

Code: Alles auswählen

data2["EAN-Nummer"]=EAN_1[data1["Artikel"]==data2["Artikel"]]
sooo. in den Fällen in welchen die Namen übereinstimmen wird der Nummer 2 der Wert von Nummer 1 zugewiesen. Das Problem ist nun nur, dass die Spalte an den Stellen an welchen Name1 != Name2 ist, der Wert NaN eingetragen wird. Das ist auch logisch da

Code: Alles auswählen

data1["Artikel"]==data2["Artikel"]
hier FALSE ist und demnach

Code: Alles auswählen

EAN_1[data1["Artikel"]==data2["Artikel"]]
NaN zurückgibt.

Meine Frage ist nun: WIE bekomme ich es hin, dass an den Stellen an welchen die Namen nicht überein stimmen, die Nummern beibehalten werden. Es dürfte sich denke ich um nur eine Zeile Code handeln aber ich komme beim besten Willen nicht drauf. Wie gesagt ich möchte es ohne Schleife sondern möglichst pythonisch machen weshalb ich (Anfänger!!) auch über alle weiteren Verbesserungsvorschläge zu meinem Code dankbar bin.
C#17
User
Beiträge: 19
Registriert: Montag 22. Mai 2017, 12:19

Ich denke ich bin mit folgendem Code auf die Lösung des Problems gestoßen.

Code: Alles auswählen

import pandas as pd


#Import the Excel Files
data1=pd.read_excel("Data_folder1.xlsx")
data2=pd.read_excel("Data_folder2.xlsx")


#Write the files to DataFarme
data1=pd.DataFrame(data1)
data2=pd.DataFrame(data2)



#Save the EAN-Numbers
EAN_2=data2["EAN-Nummer"]
EAN_1=data1["EAN-Nummer"]

#Overwrite the EAN-Numbers
data2["EAN-Nummer"]=EAN_1[data1["Artikel"]==data2["Artikel"]]

#Fill the missing values with the original EAN-Numbers from EAN_2
data2["EAN-Nummer"]=data2["EAN-Nummer"].fillna(EAN_2)
Wenn mir jemand optimierungsvorschläge für den Code hat wäre ich dennoch sehr dankbar!
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Der Vollständigkeit halber: Du schreibst, dass du eine pythonische Lösung möchtest. Das wäre in Python ohne Pandas wohl eine List Comprehension.
Diese Art mit Indizes umzugehen hat m.W.n. eher nicht so viel mit Python zu tun, sondern kommt von Pandas, das im Prinzip eine an R angelehnte DSL für Python implementiert. Manche Vorgehensweisen sind spezifisch für diese Bibliothek, außerhalb dieser aber nicht üblich oder ggf. auch nicht möglich. Das ist nicht als Wertung gemeint, sondern nur als Hinweis, um Missverständnissen vorzubeugen. :)
C#17
User
Beiträge: 19
Registriert: Montag 22. Mai 2017, 12:19

Vielen Dank für den Hinweis!!!
Antworten