如何计算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
相关产品推荐
相关产品推荐

