Seite 1 von 1

Spaltenwerte über DataFrame ändern

Verfasst: Sonntag 11. Juni 2017, 02:40
von C#17
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.

Re: Spaltenwerte über DataFrame ändern

Verfasst: Sonntag 11. Juni 2017, 11:05
von C#17
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!

Re: Spaltenwerte über DataFrame ändern

Verfasst: Sonntag 11. Juni 2017, 11:26
von nezzcarth
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. :)

Re: Spaltenwerte über DataFrame ändern

Verfasst: Sonntag 11. Juni 2017, 12:00
von C#17
Vielen Dank für den Hinweis!!!