Как мне записать в отдельные листы Excel для каждого фрейма данных, созданного из цикла for?

#python #pandas

#python #pandas

Вопрос:

У меня есть входные данные в виде словаря, состоящего из 3 фреймов данных чисел. Я хочу выполнить итерацию по каждому фрейму данных с некоторыми операциями, а затем, наконец, записать результаты для каждого фрейма данных в Excel.

Следующий код работает нормально, за исключением того, что он записывает только результирующий фрейм данных для последнего ключа в словаре.

Как мне получить результаты для всех 3 фреймов данных, записанных на отдельные листы?

 Input_Data={'k1':test1,'k2':test24,'k3':test3}

for v in Input_Data.values():
   
    df1 = v[126:236] 
    df=df1.sort_index(ascending=False)
    Indexer=df.columns.tolist()
    df = [(pd.concat([df[Indexer[0]],df[Indexer[num]]],axis=1)) for num in [1,2,3,4,5,6]]
    df = [(df[num].astype(str).agg(','.join, axis=1)) for num in [0,1,2,3,4,5]]
    df=pd.DataFrame(df)
  dff=df.loc[0].append(df.loc[1].append(df.loc[2].append(df.loc[3].append(df.loc[4].append(df.loc[5])))))


    dff.to_excel('test.xlsx',index=False, header=False)
  

Ответ №1:

Ваша первая проблема заключается в том, что с каждой итерацией цикла вы открываете новый файл.

Согласно документации pandas:

«Можно записать несколько листов, указав уникальное имя листа. Со всеми данными, записанными в файл, необходимо сохранить изменения. Обратите внимание, что создание объекта ExcelWriter с уже существующим именем файла приведет к удалению содержимого существующего файла. «

Во-вторых, вы не указываете переменное имя листа, поэтому каждый раз данные переписываются как один и тот же лист.

Пример решения с ExcelWriter

 #df1, df2, df3 - dataframes
input_data={
'sheet_name1' : df1,
'sheet_name2' : df2,
'sheet_name3' : df3
}

# Initiate ExcelWriter - use xlsx engine
writer = pd.ExcelWriter('multiple_sheets.xlsx', engine='xlsxwriter')

# Iterate over input_data dictionary 
for sheet_name, df in input_data.items():

    """
    Perform operations here
    """

    # Write each dataframe to a different worksheet.
    df.to_excel(writer, sheet_name=sheet_name)

    
# Finally, save ExcelWriter to file
writer.save()
  

Примечание 1.Вы запускаете и сохраняете объект ExcelWriter только один раз, итерации добавляют листы только к этому объекту

Примечание 2. По сравнению с вашим кодом, переменная «sheet_name» предоставляется функции «to_excel ()»

Ответ №2:

 # Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

# Write each dataframe to a different worksheet.
for sheet_name, df in zip(sheet_names, dfs):
    df.to_excel(writer, sheet_name=sheet_name)

# Close the Pandas Excel writer and output the Excel file.
writer.save()
  

Ответ №3:

Попробуйте изменить имя файла на каждой итерации:

 Input_Data={'k1':test1,'k2':test24,'k3':test3}
file_number = 1

for v in Input_Data.values():
   
    df1 = v[126:236] 
    df=df1.sort_index(ascending=False)
    Indexer=df.columns.tolist()
    df = [(pd.concat([df[Indexer[0]],df[Indexer[num]]],axis=1)) for num in [1,2,3,4,5,6]]
    df = [(df[num].astype(str).agg(','.join, axis=1)) for num in [0,1,2,3,4,5]]
    df=pd.DataFrame(df)
  dff=df.loc[0].append(df.loc[1].append(df.loc[2].append(df.loc[3].append(df.loc[4].append(df.loc[5])))))
    
    file_name='test'
    file_number=str(file_number)
    

    dff.to_excel( str(file_name file_number) ".xlsx",index=False, header=False)
    
    file_number=int(file_number)
    file_number = file_number 1
  

Комментарии:

1. Я получаю следующую ошибку can only concatenate str (not "int") to str

2. No engine for filetype: '' Связано ли это с тем, что .xlsx исключен из to_excel

3. Возможно, попробуйте сейчас