按字符串向 pandas 数据框添加颜色

Adding color by string to a pandas dataframe

我正在处理输出到 html 文件的数据框。我想为某些字符串添加颜色:

df1 = df1[(
    df1['Visitor'].str.contains('^TOR|^MTL|^CGY|^WPG|^VAN|^EDM|^OTT', na=False)
) | (df1['Home'].str.contains('^TOR|^MTL|^CGY|^WPG|^VAN|^EDM|^OTT', na=False))]

df1.fillna('', inplace=True)
df1.to_html('schedule.html', index=False)

以上代码删除了所有不包含任何列出的团队的行。我想为字符串留下的行添加颜色。例如 'TOR' 会变成蓝色。

正如在另一个线程中看到的,这是我尝试过但没有任何改变的方法:

    def styler(col):
  
    if col.name != 'Visitor vs Home':
        return [''] * len(col)

    bg_color = col.map({
        'TOR': 'blue',
        'MTL': 'red',
        'VAN': 'green',
    }).fillna('')  
    return 'background-color:' + bg_color


df1.style.apply(styler)

非常欢迎任何提示或建议。

谢谢!

Series.map can only be used for exact string matching. If needing to test for string contains, use str.contains 具有适当的模式。

然后我们可以使用 np.select to allow mapping of pattern to colour. Lastly, we can take advantage of the subset parameter of Styler.apply 仅设置特定列的样式,而不必检查传入的每个列的名称:

def color_col(col):
    return np.select(
        [col.str.contains('TOR', na=False),
         col.str.contains('MTL', na=False),
         col.str.contains('VAN', na=False)],
        ['background-color: blue',
         'background-color: red',
         'background-color: green'],
        default=''
    ).astype(str)


df.style.apply(color_col, subset=['Visitor vs Home'])

我们还可以进一步参数化我们的样式函数,以便我们可以传递图案和相应颜色的字典:

def color_col(col, pattern_map, default=''):
    return np.select(
        [col.str.contains(k, na=False) for k in pattern_map.keys()],
        [f'background-color: {v}' for v in pattern_map.values()],
        default=default
    ).astype(str)


df.style.apply(color_col,
               pattern_map={'TOR': 'blue',
                            'MTL': 'red',
                            'VAN': 'green'},
               subset=['Visitor vs Home'])

两个选项都会产生:


示例数据和导入:

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'Visitor': ['TOR', 'MTL', 'VAN', 'WPG', 'EDM'],
    'Home': ['CGY', 'WPG', 'OTT', 'TOR', 'MTL'],
    'Visitor vs Home': ['String with TOR',
                        'String with MTL',
                        'String with VAN',
                        'String with no match',
                        np.NaN]
})