You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:15:03