多Pandas DataFrame按共有pID关联并保留所有匹配行的实现方案
实现方案
核心思路
先计算所有随访批次表中共同存在的pID集合,再拼接全量数据后筛选对应记录,避免多表场景下原两表逻辑的误判问题(原两表逻辑用duplicated判断重复,多表场景下会把仅在部分表中重复出现的pID误判为符合要求的记录)。
具体实现步骤
- 第一步:把所有待处理的DataFrame存入列表,方便批量操作
# 有多少个随访表就添加多少个到列表中 df_list = [df_1, df_2, df_3, df_4]
- 第二步:计算所有表共有的pID集合
# 初始化交集为第一个表的pID集合 common_pids = set(df_list[0]['pID']) # 逐个和剩余表的pID取交集 for df in df_list[1:]: common_pids.intersection_update(set(df['pID']))
可选简洁写法:适合熟悉高阶函数的场景
from functools import reduce common_pids = reduce(lambda x, y: x.intersection(set(y['pID'])), df_list, set(df_list[0]['pID']))
- 第三步:拼接全量数据、筛选目标记录、排序输出
# 拼接所有表,同时丢弃无用的ID列 all_data = pd.concat(df_list, ignore_index=True).drop(columns=['ID']) # 筛选仅在共同pID集合中的记录,按pID排序后重置索引 out = all_data[all_data['pID'].isin(common_pids)].sort_values('pID').reset_index(drop=True)
补充说明
- 该方案不受单表内pID重复、表数量多少的影响,准确性更高
- 单表内同一个pID存在多条记录时,逻辑会正常保留所有符合要求的行
- 如果需要同时按随访批次排序,可将排序逻辑修改为
sort_values(['pID', 'Code'])
内容的提问来源于stack exchange,提问作者Trovão
相关产品推荐
相关产品推荐

