Pandas中用df.apply调用ttest_ind处理每行样本报错,求原因
问题分析与解决办法
嘿,这个问题我之前也踩过类似的坑!咱们来一步步拆解哪里出错了:
错误原因
Pandas 的 apply() 方法默认是按列(axis=0)处理的。也就是说,当你运行 df.apply(lambda x: ...) 时,这里的 x 代表的是每一列的 Series 对象,而不是你预期的每一行数据。
举个直观的例子:当代码处理到 X 列时,x 就是整个 X 列的 Series,它的索引是行号(0、1、2),根本不存在 'X' 这个键——所以你写 x['X'] 自然会抛出 KeyError,这就是报错信息里 'occurred at index X' 的原因:它正在处理 X 列,却找不到 'X' 这个索引。
而你单独处理第一行时,df['X'][0] 是直接取到了第一行 X 列的数组,和 Y 列的数组配对,所以能正常运行。
解决办法
只需要给 apply() 加上 axis=1 参数,指定按行处理即可:
from scipy import stats import pandas as pd import numpy as np # 重建你的DataFrame df = pd.DataFrame({'X': [np.random.normal(0, 1, 10), np.random.normal(0, 1, 10), np.random.normal(0, 1, 10)], 'Y': [np.random.normal(0, 1, 10), np.random.normal(0, 1, 10), np.random.normal(0, 1, 10)]}) # 按行apply,axis=1是关键 result = df.apply(lambda x: stats.ttest_ind(x['X'], x['Y'], equal_var=False)[0], axis=1) print(result)
运行这段代码后,你会得到每行对应的t检验统计量,结果类似这样(数值会因随机数不同而变化):
0 -0.321456 1 0.789012 2 -1.034567 dtype: float64
额外小提示
如果觉得lambda函数不够清晰,也可以写一个单独的函数来处理每行,可读性会更好:
def calculate_ttest(row): return stats.ttest_ind(row['X'], row['Y'], equal_var=False)[0] result = df.apply(calculate_ttest, axis=1)
内容的提问来源于stack exchange,提问作者byouness
相关产品推荐
相关产品推荐

