首页 > 解决方案 > TypeError:“系列”对象是可变的,因此它们不能被散列来修改和转换成数据框的 excel 文件

问题描述

import pandas as pd
import itertools
data = pd.read_excel("Kitchen.xlsx")
dict_data={}
for i in range(data.shape[0]):
   if(data["Yes_No"][i]=="yes"):
       if(data["Menu"] in dict_data.keys()):
           dict_data[data["Menu"][i]].append(data["Specification"][i])
       else:
           dict_data[data["Menu"][i]]=list(data["Specification"][i])
menu=pd.read_csv("Menu.csv")
menu["Menu"]=""
for i in range(menu.shape[0]):
   name=menu["Name"][i]
   comb=list(FC["Combinations"][i].split("+"))
   l=[]
   for c in comb:
       l.append(dict_data[c])
   all_combinations=list(itertools.product(*l))
   for men_cmb in all_combinations:
       s=""
       for item in men_cmb:
           s+=str(item)+"||"
       menu["Menu"][i]=s
       i+=1
menu.to_csv("Menu.csv")

我想打印菜单的成分组合。这是我第一次使用 itertools,所以我真的不知道那个错误是什么意思。我基本上想打印所有可能的组合来做一个包含不同成分的菜单。Menu.csv 是我最后的 excel,但在 Kitchen.xls 我有配料。

这是输出

C:\VEpython\Scripts\Drivers\Scripts>C:/Users/212803155/AppData/Local/Programs/Python/Python38-32/python.exe "c:/VEpython/Scripts/Drivers/Scripts/import pandas as pd.py"
Traceback (most recent call last):
  File "c:/VEpython/Scripts/Drivers/Scripts/import pandas as pd.py", line 7, in <module>
    if(data["Menu"] in dict_data.keys()):
  File "C:\Users\212803155\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\generic.py", line 1798, in __hash__
    raise TypeError(
TypeError: 'Series' objects are mutable, thus they cannot be hashed

C:\VEpython\Scripts\Drivers\Scripts>

标签: pythonpandasitertools

解决方案


您的错误更为根本,与 itertools 无关:可变类型除非提供hash方法,否则不可散列!

简单类型也会发生这种情况,但错误更清楚。

>>> set().add({'a':1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

推荐阅读