#python #pandas #dataframe #concatenation
Вопрос:
Я хотел бы объединить несколько кадров данных с помощью цикла for и функции concat и сохранить результаты во фрейме данных, называемом all_dfs, но каким-то образом, когда выполняется цикл for, он всегда выбрасывает df, который был в all_dfs раньше. Есть какие-нибудь советы, как я мог бы решить эту проблему?
for i in vd_files_list: ### Den Szenario-Namen ohne VD herausfiltern print(i) scenario_name_w_vd = i.split("/")[-1] scenario_name = scenario_name_w_vd.split(".")[0] try: VD_filename = r"{}".format(i) df = pd.read_csv(filepath_or_buffer=VD_filename, skiprows=(13), names =("Attribute", "Commodity", "Process", "Period","Region", "Vintage", "TimeSlice", "UserConstraint","PV"), dtype={"Attribute":str, "Commodity":str, "Process":str, "Period":str,"Region":str, "Vintage":str, "TimeSlice":str, "UserConstraint":str,"PV":float}) #hier wird eine extra Spalte "Szenario" mit dem Szenario-Namen hinzugefügt df["Szenario"] = scenario_name all_dfs = pd.concat([df]) print(all_dfs)
Ответ №1:
Область действия вашей all_dfs
переменной локальна внутри вашего for
цикла. Инициализируйте его до нового DataFrame
перед вашим циклом, а затем добавляйте к нему с каждой итерацией.
all_dfs = pd.DataFrame() for i in vd_files_list: ### Den Szenario-Namen ohne VD herausfiltern print(i) scenario_name_w_vd = i.split("/")[-1] scenario_name = scenario_name_w_vd.split(".")[0] try: VD_filename = r"{}".format(i) df = pd.read_csv(filepath_or_buffer=VD_filename, skiprows=(13), names =("Attribute", "Commodity", "Process", "Period","Region", "Vintage", "TimeSlice", "UserConstraint","PV"), dtype={"Attribute":str, "Commodity":str, "Process":str, "Period":str,"Region":str, "Vintage":str, "TimeSlice":str, "UserConstraint":str,"PV":float}) #hier wird eine extra Spalte "Szenario" mit dem Szenario-Namen hinzugefügt df["Szenario"] = scenario_name all_dfs.append(df) except: # what errors do you need to handle? pass print(all_dfs)
Ответ №2:
это почти решило проблему! Единственное, что я изменил, это написал all_dfs = all_dfs.append(df) вместо all_dfs.append(df)
Вот как сейчас выглядит рабочий код (плюс я добавил исключения):
all_dfs = pd.DataFrame() for i in vd_files_list: ### Den Szenario-Namen ohne VD herausfiltern print(i) scenario_name_w_vd = i.split("/")[-1] scenario_name = scenario_name_w_vd.split(".")[0] try: VD_filename = r"{}".format(i) df = pd.read_csv(filepath_or_buffer=VD_filename, skiprows=(13), names =("Attribute", "Commodity", "Process", "Period","Region", "Vintage", "TimeSlice", "UserConstraint","PV"), dtype={"Attribute":str, "Commodity":str, "Process":str, "Period":str,"Region":str, "Vintage":str, "TimeSlice":str, "UserConstraint":str,"PV":float}) #hier wird eine extra Spalte "Szenario" mit dem Szenario-Namen hinzugefügt df["Szenario"] = scenario_name all_dfs = all_dfs.append(df) print(all_dfs) except ValueError: tk.messagebox.showerror("Information", "Die ausgewählte Datei ist ungültig") return None except FileNotFoundError: tk.messagebox.showerror("Information", f" Die Datei {file_path} existiert nicht") return None