Подключение кадров данных через цикл for

#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