You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:27:10