Python手动计算协方差触发pandas iloc索引ValueError如何修复
报错根本原因
你在协方差计算的生成器表达式中写了for i in str(range(mean)),str()把整数范围转成了字符串,迭代时变量i是字符串类型的字符,而pandas的iloc基于位置索引只支持整数输入,因此触发该报错。
代码存在的其他逻辑问题
- 变量名覆盖:先定义
mean为列均值,后续for mean in range(len(col_list))把mean覆盖为循环迭代的整数,后续所有和均值相关的计算全部失效 - 均值计算错误:计算均值时用
sums += df.iloc[a]取的是整行数据,不是当前列的单个数值 - 协方差公式错误:协方差公式应为
(变量X- X的均值) * (变量Y - Y的均值)的总和除以样本数减1,你当前代码减去的是str(range(mean))完全不符合公式逻辑 - 循环边界错误:
for j in range(mean)里的mean已经被覆盖为整数,这个循环的边界逻辑完全不符合协方差矩阵的计算要求(协方差矩阵维度是列数*列数,不是样本数)
修正后的手动协方差计算代码
import pandas as pd import math df = pd.read_csv('C:/Users/User/Downloads/Admission_Predict.csv') # 筛选数值列,去掉数据集自带的序号列(不参与协方差计算) df = df.select_dtypes(include=['number']).iloc[:, 1:] # 获取样本数和特征列数 n_samples = df.shape[0] n_cols = df.shape[1] # 先预计算每一列的均值,避免重复计算 col_means = [] for col in df.columns: col_vals = df[col].tolist() col_mean = sum(col_vals) / n_samples col_means.append(col_mean) # 初始化协方差矩阵 cov_matrix = [[0.0]*n_cols for _ in range(n_cols)] # 遍历计算每两列的协方差 for j in range(n_cols): for k in range(n_cols): sum_cov = 0.0 for i in range(n_samples): # 每个样本的两列值各自减对应列的均值后相乘累加 sum_cov += (df.iloc[i, j] - col_means[j]) * (df.iloc[i, k] - col_means[k]) # 样本协方差除以n-1 cov_matrix[j][k] = sum_cov / (n_samples - 1) # 打印手动计算结果 print("手动计算协方差矩阵:") for row in cov_matrix: print([round(x, 4) for x in row]) # 可选:和pandas自带的cov方法结果对比验证正确性 print("\npandas自带接口计算结果:") print(df.cov().round(4))
内容的提问来源于stack exchange,提问作者meloqq
相关产品推荐
相关产品推荐

