如何基于指定日期的第一个DataFrame名单过滤第二个DataFrame无效记录
实现思路
首先将动态列的出勤宽表转换为「日期-出勤人」的长表结构,再通过双字段匹配过滤活动表的无效记录,完美适配出勤表列数动态变化的场景。
代码实现
首先导入依赖:
import pandas as pd
第一步:处理出勤宽表,转换为长表
# df_attend 为第一个存储出勤信息的宽表 df_attend_long = df_attend.melt( id_vars="date", # 固定日期列,剩余所有人员列自动参与转换 value_name="name" # 转换后的人员姓名字段 ).drop(columns=["variable"]) # 删掉原宽表的列序号字段(1、2、3...50这些) # 可选:去重避免同一日期下重复的人员记录干扰匹配 df_attend_long = df_attend_long.drop_duplicates(subset=["date", "name"])
第二步:匹配过滤活动表
# df_activity 为第二个存储活动信息的表 # 用内连接只保留「日期+姓名」同时出现在出勤长表中的记录,自动删除无效条目 df_activity_filtered = pd.merge( df_activity, df_attend_long, on=["date", "name"], how="inner" )
注意事项
- 需保证两个表的
date列格式完全一致,比如都为字符串格式或都为datetime格式,避免格式差异导致匹配失败 - 需保证两个表的姓名字段拼写、大小写完全一致,比如示例中出勤表的
jhohn和活动表的john拼写不同会导致匹配失效
内容的提问来源于stack exchange,提问作者Bibin Varghses
相关产品推荐
相关产品推荐

