如何使用CSV文件计算社区排行榜角色平均评分并完成排序
解决方案
你代码出现异常大值、空值干扰计算的核心原因有两点:
- 自定义
convert_to_float逻辑完全错误:x.isnumeric未加括号执行,判断恒为真;列表推导式循环顺序写反,遍历过程中反复生成全量结果列表,非评分字段被错误转换,传入DataFrame的数据结构混乱,才会出现1.241342432e+79这类无效值。 - 未对表单中空评分做标准空值转换。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
相关产品推荐
相关产品推荐

