Python提取矩阵各列中分数≥85的学生及对应科目
解决方案
嘿,作为Python新手你已经做得很棒啦!咱们一步步来实现你想要的需求:
第一步:统一列名(避免大小写/名称不一致坑)
你提供的自定义表头和示例DataFrame里的科目名有大小写差异(比如english vs English、art vs Arts),先把列名统一成小写,避免后续筛选出错:
import pandas as pd # 你读取xlsx的原有代码 header = ['S.No', 'Name', 'Science', 'english','History','art','Maths'] df = pd.read_excel('matrix.xlsx', header=None, names=header) # 统一所有列名为小写,消除匹配歧义 df.columns = df.columns.str.lower()
第二步:写个小函数处理高分科目并格式化输出
咱们定义一个函数,专门处理每一行学生数据,找出成绩≥85的科目,再转换成你要的格式:
def format_high_score_line(row): # 提取学生名字,转成小写和示例输出一致(不想转的话去掉.lower()) student_name = row['name'].lower() # 提取所有科目成绩(排除序号和名字列) score_data = row.drop(['s.no', 'name']) # 筛选出成绩≥85的科目名称 high_score_subjects = score_data[score_data >= 85].index.tolist() # 如果需要和示例输出一样的缩写(比如arts→art、maths→math),加上这一步 high_score_subjects = [ subj[:-1] if subj in ['arts', 'maths'] else subj for subj in high_score_subjects ] # 拼接成指定格式的字符串 return f"{student_name}[{','.join(high_score_subjects)}]"
第三步:遍历输出结果
最后把函数应用到每一行,打印出你要的格式:
# 遍历每一行生成并打印结果 for output_line in df.apply(format_high_score_line, axis=1): print(output_line)
用你提供的示例DataFrame测试
如果想用你给的示例DataFrame验证效果,先把它转换成和xlsx读取后的结构一致,再运行:
# 你的示例DataFrame p = pd.DataFrame.from_items([ ('Roy', [80, 75, 85, 90, 95]), ('John', [75, 80, 75, 85, 100]), ('Dave', [80, 80, 80, 90, 95]) ], orient='index', columns=['Science', 'English', 'History', 'Arts', 'Maths']) # 转换成和xlsx读取后的结构(添加Name列) p = p.reset_index().rename(columns={'index': 'Name'}) p.columns = p.columns.str.lower() # 应用函数输出结果 for output_line in p.apply(format_high_score_line, axis=1): print(output_line)
运行后会输出:
roy[history,art,math] john[art,math] dave[art,math]
小提示
- 如果你的xlsx里成绩列是字符串类型(比如带了百分号),记得先转换成数值:
score_columns = ['science', 'english', 'history', 'art', 'maths'] df[score_columns] = df[score_columns].apply(pd.to_numeric, errors='coerce') - 要是不需要把学生名字转成小写,删掉函数里的
.lower()就行。
内容的提问来源于stack exchange,提问作者helpme
相关产品推荐
相关产品推荐

