基于列分组DataFrame并生成科目状态柱状图的技术求助(数据科学新手)
解决方案:统计科目状态出现次数并生成指定格式结果
嘿,作为数据科学新手,这个需求其实用pandas就能轻松搞定,我来一步步帮你实现:
步骤1:导入必要工具
首先我们需要用到pandas库来处理DataFrame,先导入它:
import pandas as pd
步骤2:读取CSV文件
假设你的CSV文件名为students.csv,用下面的代码读取并生成DataFrame:
df = pd.read_csv('students.csv')
步骤3:转换数据格式(宽表转长表)
因为我们需要按科目来统计状态,而原始数据里每个科目是单独的列,所以得把宽表转换成每行对应一个科目+状态的长表,这里用melt函数:
# 将Name作为标识列,其他列(科目)转为Subject,对应的值转为Status melted_df = df.melt(id_vars=['Name'], var_name='Subject', value_name='Status')
步骤4:分组统计状态次数
现在我们可以按Subject和Status分组,统计每组的数量:
# 分组后用size()计数,重置索引并重命名计数列为Count result = melted_df.groupby(['Subject', 'Status']).size().reset_index(name='Count')
步骤5:调整格式匹配期望输出
注意到你期望里的科目是Sports而不是原始的sports,我们可以替换一下名称,再按科目排序让结果更清晰:
# 修正科目名称 result['Subject'] = result['Subject'].replace('sports', 'Sports') # 按科目排序,对齐期望格式 result = result.sort_values('Subject').reset_index(drop=True)
查看最终结果
运行print(result)就能得到你想要的格式:
Subject Status Count 0 English Pass 4 1 English NA 1 2 Maths Pass 5 3 Science Pass 2 4 Science Fail 3 5 Sports Pass 3 6 Sports NA 2
拓展:绘制柱状图
有了这个结果,你可以用seaborn或者matplotlib轻松画出柱状图:
import seaborn as sns import matplotlib.pyplot as plt # 绘制分组柱状图 sns.barplot(data=result, x='Subject', y='Count', hue='Status') plt.title('Subject Status Distribution') plt.xlabel('Subjects') plt.ylabel('Number of Students') plt.show()
这样就能直观展示每个科目不同状态的学生数量啦!
内容的提问来源于stack exchange,提问作者Keerthi
相关产品推荐
相关产品推荐

