Python Pandas - 突出显示列中的最大值

时间:2017-08-10 06:52:11

标签: python pandas

我有一个由此代码生成的数据框:

hmdf = pd.DataFrame(hm01)
new_hm02 = hmdf[['FinancialYear','Month']]
new_hm01 = hmdf[['FinancialYear','Month','FirstReceivedDate']]

hm05 = new_hm01.pivot_table(index=['FinancialYear','Month'], aggfunc='count')
vals1 = ['April    ', 'May      ', 'June     ', 'July     ', 'August   ', 'September', 'October  ', 'November ', 'December ', 'January  ', 'February ', 'March    ']

df_hm = new_hm01.groupby(['Month', 'FinancialYear']).size().unstack(fill_value=0).rename(columns=lambda x: '{}'.format(x))
df_hml = df_hm.reindex(vals1)

然后我有一个功能来突出显示每列中的最大值:

def highlight_max(data, color='yellow'):
    '''
    highlight the maximum in a Series or DataFrame
    '''
    attr = 'background-color: {}'.format(color)
    if data.ndim == 1:  # Series from .apply(axis=0) or axis=1
        is_max = data == data.max()
        return [attr if v else '' for v in is_max]
    else:  # from .apply(axis=None)
        is_max = data == data.max().max()
        return pd.DataFrame(np.where(is_max, attr, ''),
                            index=data.index, columns=data.columns)

然后这段代码:dfPercent.style.apply(highlight_max)产生了这个:

enter image description here

如您所见,只有第一列和最后一列突出显示了正确的最大值。

任何人都知道出了什么问题?

谢谢

3 个答案:

答案 0 :(得分:9)

您需要将值转换为浮点值才能找到正确的max,因为获取字符串的最大值 - 9更多为1

def highlight_max(data, color='yellow'):
    '''
    highlight the maximum in a Series or DataFrame
    '''
    attr = 'background-color: {}'.format(color)
    #remove % and cast to float
    data = data.replace('%','', regex=True).astype(float)
    if data.ndim == 1:  # Series from .apply(axis=0) or axis=1
        is_max = data == data.max()
        return [attr if v else '' for v in is_max]
    else:  # from .apply(axis=None)
        is_max = data == data.max().max()
        return pd.DataFrame(np.where(is_max, attr, ''),
                            index=data.index, columns=data.columns)

<强>示例

dfPercent = pd.DataFrame({'2014/2015':['10.3%','9.7%','9.2%'],
                   '2015/2016':['4.8%','100.8%','9.7%']})
print (dfPercent)
  2014/2015 2015/2016
0     10.3%      4.8%
1      9.7%    100.8%
2      9.2%      9.7%

jupyter

答案 1 :(得分:3)

使用两种颜色按列突出显示最大值最大值(轴= 1)。一种颜色突出显示重复的最大值。另一种颜色仅突出显示包含最大值的最后一列。

def highlight_last_max(data, colormax='antiquewhite', colormaxlast='lightgreen'):
    colormax_attr = f'background-color: {colormax}'
    colormaxlast_attr = f'background-color: {colormaxlast}'
    max_value = data.max()
    is_max = [colormax_attr if v == max_value else '' for v in data]
    is_max[len(data) - list(reversed(data)).index(max_value) -  1] = colormaxlast_attr
    return is_max

df.style.apply(highlight_last_max,axis=1)

答案 2 :(得分:0)

如果您使用的是 Python 3,这应该很容易做到

dfPercent.style.highlight_max(color = 'yellow', axis = 0)