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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:18:02