如何使用pandas从DataFrame中查找重复值并统计学生出现次数与所属班级
实现代码
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'biology': ['ryan', 'sarah', 'tom', 'ed', 'jackson'], 'statistics': ['sarah', 'ed', 'jacob', 'ryan', 'de'], 'ecology': ['austin', 'ryan', 'tom', 'sam', 'sarah'] }) # 1. 宽表转长表,得到「班级-学生」一对一对应关系 df_long = df.melt(var_name='班级', value_name='学生姓名') # 可选:如果存在空姓名可加这行过滤:df_long = df_long.dropna(subset=['学生姓名']) # 2. 按学生姓名分组,统计出现次数、收集所属班级 result = df_long.groupby('学生姓名').agg( 出现次数=('班级', 'count'), 所属班级=('班级', tuple) ).reset_index() # 3. 按出现次数降序排序,次数相同按姓名升序,和示例输出顺序一致 result = result.sort_values(by=['出现次数', '学生姓名'], ascending=[False, True]) # 4. 按要求格式输出 for _, row in result.iterrows(): class_str = "class" if row['出现次数'] == 1 else "classes" classes = ', '.join(row['所属班级']) print(f"{row['学生姓名']}, {row['出现次数']} {class_str}, ({classes})")
步骤说明
melt函数用来转换表结构:原表每列对应一个班级,转换后每一行存储单个学生和所属班级的对应关系,方便后续分组统计groupby按学生姓名聚合:用count计算学生出现的次数(即所属班级数量),用tuple把学生对应的所有班级名称收集为元组- 排序规则优先按出现次数从高到低,次数相同的按姓名字母顺序升序,和示例输出顺序完全匹配
- 输出时自动判断单复数,次数为1时用
class,大于1时用classes,符合要求的输出格式
内容的提问来源于stack exchange,提问作者palantir
相关产品推荐
相关产品推荐

