如何在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
相关产品推荐
相关产品推荐

