如何在Pandas左连接中获取缴费信息缺失的学生记录
找出缴费信息缺失的学生详情
我来帮你搞定这个需求!要找出那些在Fee表中没有缴费记录的学生,核心思路是利用Class、Section、RollNo这三个唯一标识字段,将两个表进行匹配,然后筛选出匹配失败的学生记录。下面是具体的实现步骤和代码:
方法一:左连接+空值筛选(最直观)
这是最常用的方法,通过左连接保留所有学生记录,再找出Fee表无匹配的行:
1. 构造示例数据
首先我们先把两个DataFrame补全(模拟Fee表缺失部分记录的场景):
import pandas as pd # 学生信息表 Students = pd.DataFrame({ 'Class': [7, 7, 8], 'Section': ['A', 'B', 'B'], 'RollNo': [2, 3, 4], 'Student': ['Ram', 'Rahim', 'Robert'] }) # 缴费信息表(这里故意缺失RollNo=4的Robert的缴费记录) Fee = pd.DataFrame({ 'Class': [7, 7, 8], 'Section': ['A', 'B', 'B'], 'RollNo': [2, 3, 5], 'FeePaid': [True, True, True] })
2. 左连接匹配两张表
用merge方法做左连接,确保Students的所有记录都被保留:
# 基于三个唯一字段做左连接 merged_df = Students.merge(Fee, on=['Class', 'Section', 'RollNo'], how='left')
3. 筛选缴费信息缺失的学生
左连接后,Fee表无匹配的行对应的Fee字段会是NaN,我们以此为依据筛选:
# 找出FeePaid为空的记录(即缴费信息缺失) missing_fee_students = merged_df[merged_df['FeePaid'].isna()] # 只保留学生详情字段,去掉空的缴费列 missing_fee_students = missing_fee_students[Students.columns]
4. 查看结果
运行后输出的结果就是缴费信息缺失的学生:
Class Section RollNo Student 2 8 B 4 Robert
方法二:利用索引匹配(适合Fee表有重复记录的场景)
如果Fee表中存在重复的缴费记录,我们可以先提取已缴费学生的唯一标识组合,再筛选Students中不在这个组合里的学生:
# 提取Fee表中已缴费学生的唯一标识(去重后) fee_paid_unique_ids = Fee[['Class', 'Section', 'RollNo']].drop_duplicates() # 将两个表的三个字段设为索引,判断Students的索引是否不在已缴费索引中 missing_fee_students = Students[ ~Students.set_index(['Class', 'Section', 'RollNo']).index.isin( fee_paid_unique_ids.set_index(['Class', 'Section', 'RollNo']).index ) ]
这个方法同样能得到和上面一致的结果,而且避免了Fee表重复记录的干扰。
内容的提问来源于stack exchange,提问作者Narendra Gadidasu
相关产品推荐
相关产品推荐

