逐行格式化pandas数据框

时间:2018-10-12 16:16:09

标签: python html pandas dataframe formatting

我有以下数据框,并希望将其转换为HTML

            Limit        Status     Warning      3M AVG
VAR1        1.20         1.21216    1.11         1.21235
VAR2        0.82         0.63075    0.75         0.593295
VAR3        0.38         0.376988   0.35         0.376988
VAR4        0.17         0.126987   0.14         0.12461

我想逐行格式化此数据框,以使:

  1. 如果Status超过Warning,则整个行将突出显示为黄色,如果超过Limit,则整个行将突出显示为红色
  2. VAR2行和VAR3行具有“ {:.2%}”格式,VAR1VAR4行具有“ {:.2f}”

我已经研究了熊猫文档,并尝试了几种方法,但无法完成上述所有任务

如果您能提供帮助,我们将不胜感激,因为我认为这对许多熊猫用户来说,逐行格式化数据框是一项挑战。

编辑1:我尝试了以下代码:

df=df.transpose()    
df.style.format("{:.2%}").format({"VAR1":"{:.2f},"VAR4":"{:.2f}"})

注意:通过转置数据框,可以轻松完成所有任务,但由于它是样式器,因此我无法将其转回其原始形状。

2 个答案:

答案 0 :(得分:1)

我认为您可以使用自定义的Styling函数来完成您想做的事情:

@FeignClient(name="mysvc", path="/mysvc")
public interface MyService {
    ...
}

@RestController
@RequestMapping("/")
public class MyServiceController implements MyService {
    ...
}

# application.properties
server.servlet.context-path=/mysvc

enter image description here

不过,您仍然必须为此添加自定义数字格式。

要获取此代码,请使用def color(row): if row.Status >= row.Limit: return ['background-color: red'] * len(row) elif row.Status >= row.Warning: return ['background-color: yellow'] * len(row) return [''] * len(row) df.style.apply(color(), axis=1) 方法:

render

df.style.apply(color(), axis=1).render()

答案 1 :(得分:1)

我遇到了同样的问题,并研究了format类中pandas.io.formats.style.Styler函数的实现,并实现了类似的按行函数:

def format_row_wise(styler, formatter):
    for row, row_formatter in formatter.items():
        row_num = styler.index.get_loc(row)

        for col_num in range(len(styler.columns)):
            styler._display_funcs[(row_num, col_num)] = row_formatter
    return styler

示例

df = pandas.DataFrame(
    {
        'Limit': [1.20, 0.82, 0.38, 0.17], 
        'Status': [1.21216, 0.63075, 0.376988, 0.126987], 
        'Warning': [1.11, 0.75, 0.35, 0.14], 
        '3M AVG': [1.21235, 0.593259, 0.376988, 0.12461]
    }, 
    index=['VAR1', 'VAR2', 'VAR3', 'VAR4']
)
formatters = {"VAR1":lambda x: f"{x:.2f}", "VAR4": lambda x: f"{x:.2f}"}
styler = format_row_wise(df.style, formatters)
styler.render()

这对我有用:)

注意

  • 我只实现了dict-formatter!
  • 必须将格式指定为函数(此处为lambda)

希望这能使您走对路...