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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:06:00