熊猫-具有apply和applymap的样式表

时间:2020-05-28 02:58:47

标签: python pandas

我有这个df_teams:

               ShortName Strength TeamColor
Team                                       
Arsenal              ARS        4   #EF0107
Aston Villa          AVL        2   #770038
Bournemouth          BOU        2   #D3151B
Brighton             BHA        2   #005DAA
Burnley              BUR        3   #630F33
Chelsea              CHE        4   #034694
Crystal Palace       CRY        3   #C4122E
Everton              EVE        3   #274488
Leicester            LEI        3   #0053A0
Liverpool            LIV        5   #CE1317
Man City             MCI        5   #97C1E7
Man Utd              MUN        4   #E80909
Newcastle            NEW        3   #231F20
Norwich              NOR        2   #00A14E
Sheffield Utd        SHU        3   #E52126
Southampton          SOU        3   #ED1A3B
Spurs                TOT        4   #132257
Watford              WAT        3   #FBEE23
West Ham             WHU        2   #7C2C3B
Wolves               WOL        4   #FDB913

我想打印一张表格,其中每一行都有团队颜色。

我知道我可以使用熊猫df_teams.style.applymap()方法。

我尝试过:

st.table(df_teams.style.applymap(lambda x:df_teams['TeamColor'][x]))

不起作用。

KeyError: 'ARS'

还尝试了apply()

st.table(df_teams.style.apply(lambda x:df_teams['TeamColor'][x], axis=0))

都不是:

ValueError: cannot reindex from a duplicate axis

我该怎么做?

最好的方法是像有一个团队颜色字典,像这样:

#A dictionary of team colors
team_colors = {'ARS':'#EF0107',
'AVL':'#770038',
'BOU':'#D3151B',
'BHA':'#005DAA',
'BUR':'#630F33',
'CHE':'#034694',
'CRY':'#C4122E',
'EVE':'#274488',
'LEI':'#0053A0',
'LIV':'#CE1317',
'MCI':'#97C1E7',
'MUN':'#E80909',
'NEW':'#231F20',
'NOR':'#00A14E',
'SHU':'#E52126',
'SOU':'#ED1A3B',
'TOT':'#132257',
'WAT':'#FBEE23',
'WHU':'#7C2C3B',
'WOL':'#FDB913'}

因此,我只能应用从该词典映射的函数,而不必在列中使用颜色作为值,这是不希望的。

我尝试过:

st.table(df_teams.style.applymap(lambda x:team_colors[x]))

但是得到:

KeyError: '4'

并传递axis=0axis=None

st.table(df_teams.style.apply(lambda x: team_colors[x], axis=0))

不!

TypeError: 'Series' objects are mutable, thus they cannot be hashed

1 个答案:

答案 0 :(得分:2)

这是一种为字体着色的(有点怪异的)方法,只需将整个数据框传递给一个函数即可抓取TeamColor

def colo(df):
    return ['color: {}'.format(df['TeamColor'])]*3 # ncols

df_teams.style.apply(colo, axis=1)

axis=1将整个行传递给该函数,该函数使我们可以为整个行着色。

要使用数据框中的一列为行的背景着色,请使用以下功能:

def colo(df):
    return ['background-color: {}'.format(df['TeamColor'])]*3

如果您想在df之外使用字典:

def colo(df, dic):
    return ['background-color: {}'.format(dic[df['ShortName']])]*3

df_teams.style.apply(colo, dic=team_colors, axis=1)

官方文档更加深入,请参阅here