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

如何使用CSV文件计算社区排行榜角色平均评分并完成排序

解决方案

你代码出现异常大值、空值干扰计算的核心原因有两点:

  1. 自定义convert_to_float逻辑完全错误:x.isnumeric未加括号执行,判断恒为真;列表推导式循环顺序写反,遍历过程中反复生成全量结果列表,非评分字段被错误转换,传入DataFrame的数据结构混乱,才会出现1.241342432e+79这类无效值。
  2. 未对表单中空评分做标准空值转换。pandas计算均值时会自动跳过NaN类型空值,只要把未填的空单元格、无效内容转成NaN就不会干扰计算,不需要手动逐行排除。

修复后可直接运行的代码

import sys
import pandas as pd
import numpy as np

def main():
    # 读取谷歌表单导出的csv,遇编码乱码可将encoding改为'utf-8-sig'
    df = pd.read_csv(sys.argv[1], encoding='utf-8')
    
    # 遍历所有列做数值转换,无效值/空值自动转成NaN(计算均值时会自动跳过)
    for col in df.columns:
        # 若表单存在提交时间、昵称等非评分列,可在此加判断跳过,例:if "评分" not in col: continue
        df[col] = pd.to_numeric(df[col], errors='coerce')
        # 可选:过滤1-10分范围外的异常误填值,统一转为空值
        df[col] = df[col].where(df[col].between(1, 10), np.nan)
    
    # 计算各角色平均评分
    avg_score = df.mean().to_dict()
    # 按平均分降序生成排行榜
    rank_list = sorted(avg_score.items(), key=lambda x: x[1], reverse=True)
    
    # 输出结果
    print("各角色平均评分:")
    for role, score in avg_score.items():
        print(f"{role}: {round(score, 2)}")
    
    print("\n最终排行榜(评分从高到低):")
    for idx, (role, score) in enumerate(rank_list, 1):
        print(f"第{idx}名:{role},平均评分{round(score, 2)}")

if __name__ == "__main__":
    main()

关键说明

  • 不需要手动用csv模块逐行读文件再转DataFrame,pandas自带的read_csv可以直接完成文件读取,适配绝大多数csv导出格式
  • pd.to_numeric(errors='coerce')会自动把空字符串、非数字内容统一转成pandas可识别的空值NaN,所有聚合计算(均值、求和等)都会默认跳过这类值,不会拉低或拉高计算结果
  • 运行方式和原代码一致,在命令行传入表单csv文件路径即可:python 脚本文件名.py 表单导出文件.csv
  • 如果需要保留小数位数,调整round(score, 2)里的数字即可,比如保留1位小数就改成round(score, 1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:18:16