Python用statsmodels做单因素ANOVA时出现set不可哈希/NameError如何解决?
错误原因
TypeError: unhashable type: 'set'报错原因:你在给df_melt设置列名时,错误使用{x}、{y}的写法,外层大括号会被Python识别为集合类型,而集合属于不可哈希类型,无法作为DataFrame的列名使用,因此触发该类型错误。NameError: name 'axis' is not defined报错原因:ols函数依赖patsy库解析公式字符串,你的默认列名x-axis、y-axis包含特殊符号-,patsy会将-识别为减法运算符,把公式y-axis ~ C(x-axis)解析为「y变量减axis变量 对 C(x变量减axis变量)回归」,自然找不到名为axis的变量,触发名称错误。就算你去掉集合的大括号,只要公式里的列名带特殊符号(减号、空格、小数点开头等),都会出现解析错误。
修正方案
你只需要修改两处代码即可适配自定义列名需求:一是去掉列名赋值时的多余大括号,二是给公式中的列名用反引号包裹,让patsy将其识别为完整列名,不会拆分解析特殊符号。修正后完整代码如下:
import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols def onewayanaova(csv, vars, x="x-axis", y="y-axis"): df = pd.read_csv(csv, delimiter=",") df_melt = pd.melt(df.reset_index(), id_vars=['index'], value_vars=vars) # 修正1:去掉包裹x/y的大括号,直接传入字符串作为列名 df_melt.columns = ['index', x, y] # 修正2:用反引号包裹公式中的列名,避免特殊符号被解析为运算符 model = ols(f'`{y}` ~ C(`{x}`)', data=df_melt).fit() anova_table = sm.stats.anova_lm(model, typ=2) print("The One-Way Anova Test Values are:\n") print(anova_table) onewayanaova("Book1.csv", ["a","b","c"])
内容的提问来源于stack exchange,提问作者Alireza Ghaffarian
相关产品推荐
相关产品推荐

