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

在Python Pandas中比较列与列表列并高亮匹配项

问题描述

我在Pandas中有两个DataFrame:

import pandas as pd

df1 = pd.DataFrame({"ID": [1, 2, 5, 9, 15, 44]})

df2 = pd.DataFrame({"col1": ["a", "b", "c", "d"], 
"col2":[[1, 2, 3, 4, 5], [6, 9, 15, 16, 18], [44], [88, 564, 9856]]})

需要找出df1["ID"]与df2["col2"]中的匹配项,若存在匹配项,希望在df2中高亮它们。

尝试了如下代码但无法正常运行:

def highlight():
    df = pd.DataFrame(columns=d.columns, index=d.index)
    df2.loc[df2['col2'].eq(df1['ID']), ['col1', 'col2']] = 'background: yellow'
    return df
    
df1.style.apply(highlight, axis=None)
问题分析

原代码存在几个关键问题:

  • 引用了未定义的变量d,应为df2
  • 直接用列表与Series比较df2['col2'].eq(df1['ID'])无法正确识别列表内的匹配元素
  • 错误地对df1应用样式,实际需要高亮的是df2
  • 样式函数未返回与原DataFrame形状一致的样式结果,而是直接修改原DataFrame
解决方法

方法1:高亮包含匹配项的整行

先将df1的ID转为集合以提升查找效率,再编写样式函数判断每行是否存在匹配项,返回对应样式:

import pandas as pd

df1 = pd.DataFrame({"ID": [1, 2, 5, 9, 15, 44]})
df2 = pd.DataFrame({"col1": ["a", "b", "c", "d"], 
                    "col2":[[1, 2, 3, 4, 5], [6, 9, 15, 16, 18], [44], [88, 564, 9856]]})

id_set = set(df1['ID'])

def highlight_matching_rows(row):
    has_match = any(x in id_set for x in row['col2'])
    return ['background-color: yellow' if has_match else '' for _ in row]

# 对df2应用样式
df2.style.apply(highlight_matching_rows, axis=1)

方法2:高亮列表内的具体匹配元素

若需要精准高亮col2列表中的匹配元素,可将列表转为带HTML标记的字符串,再通过样式渲染:

import pandas as pd

df1 = pd.DataFrame({"ID": [1, 2, 5, 9, 15, 44]})
df2 = pd.DataFrame({"col1": ["a", "b", "c", "d"], 
                    "col2":[[1, 2, 3, 4, 5], [6, 9, 15, 16, 18], [44], [88, 564, 9856]]})

def format_col2(col):
    id_set = set(df1['ID'])
    formatted = []
    for lst in col:
        elements = []
        for num in lst:
            if num in id_set:
                elements.append(f'<span style="background-color: yellow;">{num}</span>')
            else:
                elements.append(str(num))
        formatted.append(', '.join(elements))
    return formatted

# 应用格式化并渲染HTML
df2.style.format({'col2': format_col2}).set_properties(**{'text-align': 'left'})

方法说明

  • 方法1操作简单,适合快速标记包含匹配项的整行
  • 方法2可精准高亮列表内的匹配元素,适合需要精细展示的场景

内容的提问来源于stack exchange,提问作者Mr.Slow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:50:34