如何对比两个Pandas DataFrame生成无重复的布尔值列?
Pandas会话表添加文件打开状态布尔列解决方案
核心思路
先对文件打开记录表按SID聚合,计算每个会话的两个打开状态,再通过左连接合并到会话表,确保会话表每行唯一SID不重复。
步骤1:准备示例数据(可跳过,用于验证逻辑)
import pandas as pd # 会话表:每行对应唯一SID,包含医生、患者字段 session_df = pd.DataFrame({ 'SID': ['S001', 'S002', 'S003'], 'Doctor': ['Dr.A', 'Dr.B', 'Dr.C'], 'Patient': ['P001', 'P002', 'P003'] }) # 文件打开记录表:同一SID可能对应多条打开记录 open_records_df = pd.DataFrame({ 'SID': ['S001', 'S001', 'S002'], 'Opener': ['Dr.A', 'P001', 'P002'] })
步骤2:聚合文件打开记录的状态
先关联会话表获取每个打开记录对应的医生,标记是否为医生打开,再按SID聚合得到会话级的状态:
# 关联会话表,匹配每个打开记录对应的医生 temp = open_records_df.merge(session_df[['SID', 'Doctor']], on='SID', how='left') # 标记当前打开人是否是该会话的医生 temp['is_doctor'] = temp['Opener'] == temp['Doctor'] # 按SID聚合,计算两个布尔状态 aggregated_status = temp.groupby('SID').agg( is_doctor_opened=('is_doctor', 'any'), # 该会话是否有医生打开过 is_anyone_opened=('Opener', 'any') # 该会话是否有任何人打开过 ).reset_index()
步骤3:合并到会话表
用左连接保证会话表原始行全部保留,无打开记录的会话填充False:
final_df = session_df.merge(aggregated_status, on='SID', how='left').fillna(False)
验证结果
执行print(final_df)会输出:
SID Doctor Patient is_doctor_opened is_anyone_opened 0 S001 Dr.A P001 True True 1 S002 Dr.B P002 False True 2 S003 Dr.C P003 False False
关键注意点
- 必须通过
groupby聚合打开记录表,确保每个SID仅生成一行结果,避免合并后会话表出现重复行 - 左连接(
how='left')确保会话表所有原始会话都被保留,不会丢失数据 fillna(False)处理无打开记录的会话,将缺失的状态值统一设为False
内容的提问来源于stack exchange,提问作者Semyaz
相关产品推荐
相关产品推荐

