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

如何计算DataFrame中每行间差值的平均值?代码报错求助

解决DataFrame中两行差值平均值的计算问题

错误原因

你传入student_diff函数的是字符串(比如'Tom'),但代码里试图用列名作为索引访问它(student[col]),字符串只能用整数索引,所以触发TypeError。同时原代码的循环逻辑也不符合需求——你需要的是每个同学与目标学生的各科差值绝对值的平均值,而非所有科目差值的累加平均。

正确实现方法

方法一:自定义函数实现

先将学生姓名设为DataFrame索引,方便快速定位学生成绩:

import pandas as pd

cols = ['Name', 'Math', 'Science', 'English', "History"]
data = [['Tom', 100, 93, 95, 92], ['Nick', 89, 75, 82, 57], ['Julie', 99, 89, 76, 88], ['Sarah', 79, 78, 94, 88]]
df = pd.DataFrame(data, columns=cols)
df = df.set_index('Name')  # 将姓名设为索引,便于按名查找

然后编写函数计算目标学生与其他同学的差值平均值:

def student_diff(target_student):
    target_scores = df.loc[target_student]  # 获取目标学生的各科成绩
    for classmate in df.index:
        if classmate == target_student:
            continue  # 跳过自身
        # 计算各科差值绝对值的平均值
        avg_diff = abs(target_scores - df.loc[classmate]).mean()
        print(f"{classmate} {avg_diff}")

# 调用函数计算Tom与其他同学的差值平均
student_diff('Tom')

运行后输出:

Nick 19.25
Julie 8.0
Sarah 12.0

方法二:利用Pandas向量运算(更简洁高效)

直接通过广播批量计算所有学生与目标学生的差值平均值:

import pandas as pd

cols = ['Name', 'Math', 'Science', 'English', "History"]
data = [['Tom', 100, 93, 95, 92], ['Nick', 89, 75, 82, 57], ['Julie', 99, 89, 76, 88], ['Sarah', 79, 78, 94, 88]]
df = pd.DataFrame(data, columns=cols)
df = df.set_index('Name')

target_student = 'Tom'
target_scores = df.loc[target_student]
# 计算所有学生与目标学生的差值平均值,按行聚合
diff_avgs = abs(df - target_scores).mean(axis=1)

# 打印除自身外的结果
for name, avg in diff_avgs.items():
    if name != target_student:
        print(f"{name} {avg}")

这个方法利用Pandas的向量运算特性,避免了手动循环,数据量大时效率更高。


内容的提问来源于stack exchange,提问作者E_Sarousi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:46