在pandas数据框中的列表中仅对某些值着色

问题描述

我有一个数据框,其中一列中的每个单元格都包含格式为[2,19,25,39,49]的列表。我想为列表common = [7,9,16,18,20,21,33,35,38,40,49]中包含的每个列表中的各个值上色,因此在示例19,25和49中应使用不同的颜色,或者这就是我想要实现的。 我尝试使用:

def color_common(x):
   if x in common:
     color='green'
   else:
     color='black'

我得到的答复是“系列的真实价值不明确”。 如果我使用x.any(),则会得到“结果具有形状:(6,) 预期形状:(5,6)“ 我不了解预期的形状注释,模棱两可的真相以及在何处/如何应用any()或all()。 可以为列表的各个元素上色吗?我很容易为整个单元格或单元格的内容上色。在可能出现“我的问题愚蠢”之前,我还没有设置过熊猫数据框的样式

解决方法

common (您的列表)转换为正则表达式模式:

pat = re.compile(r'\b(' + '|'.join(map(str,common)) + r')\b')

(需要重新导入)。

然后定义以下格式功能:

def myFmt(txt):
    return pat.sub(r'<font color="#ff0000">\1</font>',repr(txt))

(我假设所需的格式为“红色”,但请对其进行更改 根据您想要的。)

要显示格式化的DataFrame,请运行:

df.style.format(myFmt)

为了对其进行测试,我创建了一个包含以下内容的数据框:

              A             B
0    [1,9,25]  [10,18,77]
1    [3,7,22]   [4,21,27]
2  [11,16,29]  [24,38,41]

并得到以下结果:

enter image description here

注意:如果您只想将此格式应用于选定的列, 通过带有列的列表的 subset 参数。