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

如何在Python中向Scipy Stats函数动态传递多参数?

动态传递可变数量参数给scipy.stats.kruskal

嘿,我明白你的问题了——要动态给stats.kruskal传参数,因为分组数量不固定,手动写死肯定不行。其实Python里有个非常方便的技巧能解决这个问题:用解包操作符*,配合列表来收集所有需要的分组数据就行。

核心思路

scipy.stats.kruskal接受任意数量的数值序列作为位置参数(比如kruskal(group1, group2, group3)),但当分组数量不确定时,我们可以:

  • 把所有分组对应的数值序列收集到一个列表里
  • 用*操作符把列表中的每个元素作为单独的参数传给函数

简化实现(用pandas groupby)

最简洁的方式是用pandas的groupby来自动分组,不用手动循环筛选:

import scipy.stats as stats

# 定义你的列名(对应你代码里的attributes)
dependent_col = attributes[0]  # 比如'Oceny'或'Mark'
independent_col = attributes[1]  # 比如分组列

# 按分组列聚合,提取每个组的数值列
grouped_data = dataset.groupby(independent_col)[dependent_col]

# 把每个组的数值序列转换成列表
groups = [group for _, group in grouped_data]

# 动态传递参数给kruskal
statistic, p_value = stats.kruskal(*groups)

如果你不想用groupby(适配你原来的思路)

如果更习惯手动筛选每个分组,可以调整你原来的代码,把每个分组的数值列收集到列表里,而不是拼接字符串:

import scipy.stats as stats

dependent_col = attributes[0]
independent_col = attributes[1]

# 获取所有唯一的分组值
unique_groups = dataset[independent_col].unique()

# 收集每个分组对应的数值序列
groups = []
for group_val in unique_groups:
    # 筛选当前分组的数值列,添加到列表
    group_data = dataset.loc[dataset[independent_col] == group_val, dependent_col]
    groups.append(group_data)

# 动态调用kruskal
statistic, p_value = stats.kruskal(*groups)

为什么你的字符串拼接思路行不通?

你之前尝试用字符串拼接数组的方式是错误的,因为stats.kruskal需要的是实际的数值序列(比如pandas Series或numpy数组),而不是字符串形式的代码。用列表收集真实的数据对象,再通过*解包,才能让函数正确识别每个参数。

验证一下

比如你的手动示例里有3个分组,groups列表会包含3个Series,stats.kruskal(*groups)就等价于stats.kruskal(c['Mark'], d['Mark'], e['Mark']),完全符合手动调用的逻辑,但不管分组是3个还是10个,代码都能自动适配。

内容的提问来源于stack exchange,提问作者Mr Lukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:11