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

标签 python pandas dataframe pandas-styles

我正在处理一个输出到 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只能用于精确字符串匹配。如果需要测试字符串包含,请使用 str.contains具有适当的模式。

然后我们可以使用np.select允许将图案映射到颜色。最后,我们可以利用 Styler.applysubset 参数仅设置特定列的样式,而不必检查传入的每列的名称:

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'])

两个选项都会产生:

styled table


示例数据和导入:

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]
})

关于python - 按字符串向 pandas 数据框添加颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69667301/

相关文章:

python - 当我尝试对 pandas 数据框中的多列求和时,为什么会收到错误消息?

python - 如何在 Python 中使用 Youtube API 在 channel 中创建广播?

python - 获取列表中项目的错误值?设计问题还是逻辑问题?

python-3.x - 拆开 pandas 数据框

python - 将字典中的值映射到 Pandas 中列的子集的最快方法是什么?

python - 计算一年中的周数(处理一年中的第一周)

python - 具有逻辑条件的 pandas 数据帧 groupby 的过滤语法

python - 是否有任何 python 或 scala 工具来连接 spark/shark

python - 在 Python 中按地址拆分字符串,就像在 C 中一样(Python 的字符串切片)

python - 如何选择行中的第二个最小值并返回它们各自的列名?