如何根据 pandas 数据框中另一列的元素设置列元素的样式?

问题描述 投票:0回答:1

例如,我有一个 pandas 数据框,如下所示:

import pandas as pd

# Sample DataFrame
data = {
    'Greek letters': ["Alpha", "Beta", "Gamma", "Omega", "Delta"],
    'English letters': ["A", "B", "C", "D", "E"],
    'Greek Letter score': [5, 10, 15, 20, 25],
    'English Letter score': [3, 11, 12, 18, 25]
}
df = pd.DataFrame(data)

我想要做的是根据各自的分数仅将特定的背景颜色应用于

Greek letters
English letters
列中的元素(因此,分别基于
Greek Letter score
English Letter score
列中的元素)。

def highlight_letter(value):
    # How would I use the letter element to obtain its corresponding score?
    # score = some technique to obtain the letter's score 
    if score <= 10:
        return 'background-color: lightgreen'
    elif score <= 20:
        return 'background-color: yellow'
    else:
        return 'background-color: blue'

styled_df = df.style.applymap(highlight_letter, subset=['Greek letters', 'English letters'])

这就是预期的输出应该是这样的:

python pandas background-color
1个回答
0
投票

其实,你需要的不是

applymap
,而是沿行的
apply
。为了避免硬编码,我们假设您至少有像 “Something letter”“Something Letter Score” 这样的对,无论大小写和列顺序如何。考虑到这一点,我建议采用这种方法:

def highlight_letter(record):
    formatting = record.copy()
    subset = record.index.str.endswith('letters')
    formatting[~subset] = ''
    for name in formatting.index[subset]:
        score = record[name[:-1] + ' score']   # -1 to drop ending s in letters
        formatting[name] = (
            'background-color: lightgreen' if score <= 10 else
            'background-color: yellow' if score <= 20 else
            'background-color: blue'
        )
    return formatting


styled_df = df.rename(columns=str.lower).style.apply(
    highlight_letter,
    axis='columns'
)

测试数据的输出如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.