2016-09-10 2 views
0

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

Во всяком случае, я играл с Pandas и Numpy, чтобы сделать некоторые вычисления из Excel.

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

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

В коде вы видите, что save_excel просто делает пронумерованные листы (и отлично работает), а save_excelB пытается сделать то, что я описываю, но я не могу заставить его работать.

from generate import A,b,L,dr,dx 
from pandas import DataFrame as df 
from pandas import ExcelWriter as ew 

A=df(A) #turning numpy arrays into dataframes 
b=df(b) 
L=df(L) 
dr=df(dr) 
dx=df(dx) 

C=[A,b,L,dr,dx] #making a list of the dataframes to iterate through 


def save_excel(filename, item): 
    w=ew(filename) 
    for n, i in enumerate(item): 
     i.to_excel(w, "sheet%s" % n, index=False, header=False) 
    w.save() 

def save_excelB(filename, item): 
    w=ew(filename) 
    for name in item: 
     i=globals()[name] 
     i.to_excel(w, sheet_name=name, index=False, header=False) 
    w.save() 

Я запускаю оба метода так же, как я вызываю функцию, и добавляю имя файла, а для элемента I вставляю список C, который я сделал.

Так было бы:

save_excelB("file.xlsx", C) 

и это то, что я получаю

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed 
+2

Как вы называете эти функции? Как он не делает то, что вы ожидаете? –

+0

Я запускаю оба так же, как я вызываю функцию, и добавляю имя файла, а для элемента i вставляю список C, который я сделал. Поэтому было бы: save_excelB («file.xlsx», C) и это то, что я получаю TypeError: объекты «DataFrame» изменчивы, поэтому они не могут быть хэшированного – 6F4E37

+0

Это лучшее, что вы [править] Ваш вопрос чтобы включить эту информацию ... :) –

ответ

0

Вам нужно передавать строковые литералы имен кадров данных в функции, а не фактические объекты данных кадра:

C = ['A', 'b', 'L', 'dr', 'dx'] 

def save_excelB(filename, item): 
    w=ew(filename) 
    for name in item: 
     i=globals()[name] 
     i.to_excel(w, sheet_name=name, index=False, header=False) 
    w.save() 

save_excelB("file.xlsx", C) 

Вы даже можете динамически создать C со всеми кадрами данных, находящимися в настоящее время в глобальной среде, путем проверки элементов, которые относятся к классу данных типа панд:

import pandas as pd 
... 

C = [i for i in globals() if type(globals()[i]) is pd.core.frame.DataFrame] 
+0

Это имеет смысл. Спасибо! Теперь он отлично работает. – 6F4E37