【问题标题】:TypeError: Unsupported type <type 'list'> in write()TypeError:不支持的类型 <type 'list'> in write()
【发布时间】:2016-02-23 08:48:23
【问题描述】:

我正在尝试通过以下几行将一堆dicts 转储到.xlsx 文件中:

H=0.5 #Used to name the xlsx file
fail_thre=0.2 #Used to name the xlsx file
dict_list=[dict1,dict2,dict3] #The list of dictionaries to be dumped
myindex=['event 1','event 2','event 3'] #Used to name rows
from itertools import izip_longest
stats_matrix=[ tuple('dict{}'.format(i+1) for i in range(len(dict_list))) ] + list( izip_longest(*([ v for k,v in sorted(d.items())] for d in dict_list)) )
import pandas as pd
column_names=['Dict1','Dict2','Dict3']
mydf=pd.DataFrame(stats_matrix,index=myindex,columns=column_names) #Creating a data frame for MS Excel visualization
mydf.columns = ['Dict1','Dict2','Dict3']
writer = pd.ExcelWriter('Lattice_stats_H_'+str(Hurst)+'FAIL_'+str(fail_thre)+'_FLOODING.xlsx', engine='xlsxwriter')
mydf.to_excel(writer, sheet_name='Lattice')   
writer.save()

但是我得到了这个错误(请注意column_namesmydf.columns等中的名字是我的dicts的真实名字,太长了不能贴出来):

TypeError                                 Traceback (most recent call last)
C:\Users\Francesco\Desktop\Scripts\Network_Scripts\Lattice_ForLoop_FLOODING.py in <module>()
    399 mydf.columns = ['failed_nodes_1Stage','percent_failed_haz','act_nodes_1Stage','percent_active_haz','failed_nodes_2Stage','percent_failed_conn','failed_nodes_1plus2','percent_failed_1plus2','act_nodes_2Stage','percent_active_conn','total_failed_nodes','percent_total_failed_nodes','total_active_nodes','percent_total_active_nodes','giant_component','center_giant_comp','network_diam','connectedness','average_degree', 'graph_len']
    400 writer = pd.ExcelWriter('Lattice_stats_H_'+str(Hurst)+'FAIL_'+str(fail_thre)+'_FLOODING.xlsx', engine='xlsxwriter')
--> 401 mydf.to_excel(writer, sheet_name='Lattice')
    402 writer.save()
    403 

C:\Users\Francesco\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\frame.pyc in to_excel(self, excel_writer, sheet_name, na_rep, float_format, columns, header, index, index_label, startrow, startcol, engine, merge_cells, encoding, inf_rep)
   1272         formatted_cells = formatter.get_formatted_cells()
   1273         excel_writer.write_cells(formatted_cells, sheet_name,
-> 1274                                  startrow=startrow, startcol=startcol)
   1275         if need_save:
   1276             excel_writer.save()

C:\Users\Francesco\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\io\excel.pyc in write_cells(self, cells, sheet_name, startrow, startcol)
   1337                 wks.write(startrow + cell.row,
   1338                           startcol + cell.col,
-> 1339                           cell.val, style)
   1340 
   1341     def _convert_to_style(self, style_dict, num_format_str=None):

C:\Users\Francesco\AppData\Local\Enthought\Canopy32\User\lib\site-packages\xlsxwriter\worksheet.pyc in cell_wrapper(self, *args, **kwargs)
     62             args = new_args
     63 
---> 64         return method(self, *args, **kwargs)
     65 
     66     return cell_wrapper

C:\Users\Francesco\AppData\Local\Enthought\Canopy32\User\lib\site-packages\xlsxwriter\worksheet.pyc in write(self, row, col, *args)
    429             pass
    430         except TypeError:
--> 431             raise TypeError("Unsupported type %s in write()" % type(token))
    432 
    433         # Finally try string.

TypeError: Unsupported type <type 'list'> in write() 

我做错了什么?

【问题讨论】:

    标签: python excel pandas dataframe typeerror


    【解决方案1】:

    您的 mydf 数据框在数据框单元格中有 list 类型的元素。这可能是由于您构建stats_matrix 的方式。请参阅the pandas docs 了解调用 DataFrame 的适当方法。要查找您的问题,您可以致电mydf.applymap(type) 并查看列表位于mydf 的位置。

    如果您想将这些列表项转换为不带大括号/方括号的字符串,您可以使用此函数将罪魁祸首列转换为有效的列:

    def list_to_number_string(value):
        if isinstance(value, (list, tuple)):
            return str(value)[1:-1]
        else:
            return value
    
    mydf[badcol] = mydf[badcol].apply(list_to_number_string)
    

    【讨论】:

    • 找到了。有一列带有list 类型。而且,不幸的是,我真的需要那个专栏是这样的。有什么解决方法吗?该列的值类似于:17,56,89,212,567,789。也就是说,一个整数列表。
    • 添加了一个功能来清理问题单元格。
    • mydf[center_giant_comp] = mydf[center_giant_comp].apply(list_to_number_string) 行抛出错误,因为要写入的字典实际上是 OrderedDicts。为了解决这个问题,我应该对您的功能进行哪些更改?
    • 这取决于 OrderDict 内容的外观以及您希望它在 Excel 单元格中的外观。如果您共享该信息,将很容易添加到该功能中。
    • 这是输入建议函数之前有序 dict 的样子:center_giant_comp={'event 1':[12,45,78,123],'event 2':[67,89,345,678],'event 3':[346,678],...,'event n':[num1,num2,num3...]}。每个列表中的值的数量是 0 或偶数,并且它们始终是整数。
    猜你喜欢
    • 2016-12-27
    • 2018-08-20
    • 2021-06-02
    • 2020-03-06
    • 2014-12-28
    • 2012-12-12
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多