2016-05-02 1 views
2

Пытается научить себя кодированию, чтобы автоматизировать некоторые утомительные задачи на работе. Прошу прощения за любое непреднамеренное незнание.Pandas: Итерация через список DataFrames и экспорт каждого на листы Excel

Я создал фреймы данных в пандах (python 3.x). Я хочу напечатать каждый кадр данных на другом листе excel. Вот то, что у меня есть для 2 Data Frames, оно отлично работает, но я хочу масштабировать его, чтобы перебрать список кадров данных, чтобы я мог сделать его немного более динамичным.

writer = pandas.ExcelWriter("MyData.xlsx", engine='xlsxwriter') 
Data.to_excel(writer, sheet_name="Data") 
ByBrand.to_excel(writer, sheet_name="ByBrand") 
writer.save() 

Простой, но когда есть 50+ листов, которые необходимо создать, это будет утомительно.

Вот что я пробовал, это не сработало:

writer = pandas.ExcelWriter("MyData.xlsx", engine='xlsxwriter') 
List = [Data , ByBrand] 
for i in List: 
     i.to_excel(writer, sheet_name= i) 
writer.save() 

Я думаю, что проблема в том, что поле название_листа должно быть строкой, потому как есть он создает ошибку. Но если я помещаю sheet_name = "i", он создает только один лист под названием i с данными из Data, но не перебирает ByBrand. Кроме того, файл excel был бы кошмаром, если бы листы не были названы в их соответствующий кадр данных, поэтому, пожалуйста, никаких предложений для таких вещей, как пронумерованные листы.

Благодарим вас за это заранее, этот сайт был бесценен для моего путешествия в кодирование.

-Stephen

ответ

1

Это легче перейти из строки 'Data' к значению Data, чем наоборот. Вы можете использовать locals()['Data'] для доступа значение, связанное с переменной, строка имя 'Data':

import pandas as pd 

writer = pd.ExcelWriter("MyData.xlsx", engine='xlsxwriter') 
seq = ['Data', 'ByBrand'] 
for name in seq: 
    df = locals()[name] 
    df.to_excel(writer, sheet_name=name) 
writer.save() 

locals() возвращает только для чтения словарь, содержащий локальные переменные текущего прицела. globals() возвращает словарь, содержащий глобальные переменные текущей области видимости. (Таким образом, если Data и ByBrand определены в глобальном пространстве имен, а не локальное пространство имен, используйте globals() вместо locals().)


Другой вариант заключается в сборе DataFrames в Словаре. Вместо того чтобы создать переменную для каждого DataFrame, сделать один Dict, и пусть ключи будут имена листов и значения будут DataFrames:

import pandas as pd 

dfs = dict() 
dfs['Data'] = ... 
dfs['ByBrand'] = ... 

writer = pd.ExcelWriter("MyData.xlsx", engine='xlsxwriter') 
for name, df in dfs.items(): 
    df.to_excel(writer, sheet_name=name) 
writer.save() 

Я думаю, что это предпочтительнее, так как он не требует самоанализа инструментов, таких как locals() или globals() , Этот второй подход просто использует dict, как предполагается использовать dicts: сопоставление ключей со значениями.