例如,我有一个 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'])
这就是预期的输出应该是这样的:
其实,你需要的不是
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'
)