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
关键改进点
- 避免重复列:不再使用
merge生成带_2后缀的重复列,而是直接筛选唯一行后合并,保持原始列结构 - 精准筛选唯一行:通过
isin直接判断id是否存在于另一个DataFrame,一步到位移除共同行 - 样式与列控制分离:用
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
相关产品推荐
相关产品推荐

