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

Pandas对比DataFrame:显示唯一行、按来源设背景色及去重列问题

解决Pandas唯一行筛选及带样式去重列问题

核心问题拆解

你需要实现两个目标:

  • 仅保留仅存在于单个DataFrame的行(移除同时出现在两个DataFrame的行)
  • 按行所属的DataFrame设置不同背景色,且不显示重复列

修正后的代码实现

import pandas as pd

# 创建原始DataFrame
data1 = {'id': [1, 2, 3], 'name': ['John', 'Mary', 'Bob']}
df1 = pd.DataFrame(data1)
data2 = {'id': [2, 3, 4], 'name': ['Mary', 'Bob', 'Alice']}
df2 = pd.DataFrame(data2)

# 1. 筛选仅在单个DataFrame中存在的行
# 提取仅在df1中出现的id对应的行
df1_unique = df1[~df1['id'].isin(df2['id'])].assign(source='df1')
# 提取仅在df2中出现的id对应的行
df2_unique = df2[~df2['id'].isin(df1['id'])].assign(source='df2')

# 合并成一个包含唯一行的DataFrame
combined_unique = pd.concat([df1_unique, df2_unique], ignore_index=True)

# 2. 定义行背景色样式函数
def color_rows(row):
    if row['source'] == 'df1':
        return ['background-color: palegreen'] * len(row)
    else:
        return ['background-color: powderblue'] * len(row)

# 3. 应用样式并隐藏辅助的source列
styled_table = combined_unique.style.apply(color_rows, axis=1).hide_columns(['source'])

# 显示结果
styled_table

关键改进点

  1. 避免重复列:不再使用merge生成带_2后缀的重复列,而是直接筛选唯一行后合并,保持原始列结构
  2. 精准筛选唯一行:通过isin直接判断id是否存在于另一个DataFrame,一步到位移除共同行
  3. 样式与列控制分离:用assign添加临时标记列source用于判断背景色,最后通过hide_columns隐藏该辅助列,既保留样式逻辑又不影响显示效果

补充说明

如果你的“共同行”定义是整行完全相同(而非仅id相同),只需把筛选逻辑改成:

# 筛选整行仅在df1存在的行
df1_unique = df1[~df1.apply(tuple, axis=1).isin(df2.apply(tuple, axis=1))].assign(source='df1')
# 筛选整行仅在df2存在的行
df2_unique = df2[~df2.apply(tuple, axis=1).isin(df1.apply(tuple, axis=1))].assign(source='df2')

内容的提问来源于stack exchange,提问作者Bindestrich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:34:57