如何通过For循环将结果存储为DataFrame并生成符合等级规则的CSV文件及报错解决
解决AttributeError并实现成绩等级计算与DataFrame存储问题
首先,咱们先搞清楚你遇到的AttributeError: 'str' object has no attribute 'append'错误原因:
你在for循环里把原本指向DataFrame的变量df重新赋值成了grading(row['score'])返回的字符串(比如'A'、'E'这类等级),之后再调用df.append()时,自然会报错——字符串类型根本没有append方法呀!
接下来咱们一步步修正代码,同时满足你的两个需求:生成符合等级规则的CSV文件,以及正确用循环(或更高效的方式)把结果存入DataFrame。
方法1:使用For循环实现(符合你的需求)
我们需要保留原始DataFrame,然后新增一列grade,在循环里逐个计算每个学生的等级并赋值:
import pandas as pd # 定义等级计算函数 def grading(x): if 90 <= x <= 100: return 'A' elif 85 <= x <= 89.99: return 'B+' elif 80 <= x <= 84.99: return 'B' elif 75 <= x <= 79.99: return 'C+' elif 70 <= x <= 74.99: return 'C' elif 65 <= x <= 69.99: return 'D+' elif 60 <= x <= 64.99: return 'D' else: return 'E' # 读取输入CSV文件 student_list = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/PYTHON CLASS/example_name-score.csv') df = pd.DataFrame(student_list) # 新增grade列,初始值设为空 df['grade'] = '' # 使用iterrows循环遍历每一行,计算等级并赋值 for index, row in df.iterrows(): # 计算当前行的成绩等级 current_grade = grading(row['score']) # 把等级赋值给df的grade列对应行 df.loc[index, 'grade'] = current_grade # 输出带等级的CSV文件 df.to_csv('student_grades.csv', index=False) # 查看结果 print(df.head())
方法2:更高效的pandas apply方法(推荐)
虽然你提到了For循环,但pandas提供了更高效的apply方法,不需要手动写循环,代码更简洁:
import pandas as pd def grading(x): if 90 <= x <= 100: return 'A' elif 85 <= x <= 89.99: return 'B+' elif 80 <= x <= 84.99: return 'B' elif 75 <= x <= 79.99: return 'C+' elif 70 <= x <= 74.99: return 'C' elif 65 <= x <= 69.99: return 'D+' elif 60 <= x <= 64.99: return 'D' else: return 'E' # 读取数据 df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/PYTHON CLASS/example_name-score.csv') # 直接用apply生成grade列 df['grade'] = df['score'].apply(grading) # 保存为CSV df.to_csv('student_grades.csv', index=False) print(df.head())
关键说明:
- 两种方法都实现了:读取输入CSV、计算等级、新增等级列、输出带等级的CSV文件。
- 方法1严格遵循了你要求的For循环方式,适合理解遍历DataFrame的过程;方法2是pandas的惯用写法,处理大数据量时效率更高。
- 注意
to_csv时加上index=False,避免把DataFrame的索引列写入CSV文件。
内容的提问来源于stack exchange,提问作者Sutthida
相关产品推荐
相关产品推荐

