【问题标题】:How to set up dynamic conditional formatting of cells in Dash - datatable如何在 Dash 中设置单元格的动态条件格式 - 数据表
【发布时间】:2020-07-04 00:06:23
【问题描述】:

喂!我是新手。面临一个问题: 我有一个数据表,其中包含我通过回调输入更新的值。他们的工作就像

data = pd.read_excel('Sample.xlsx')

app_layout=html.Div([
    html.Div([dcc.Input(id='salary_budget_2020', type='number')]),
    html.Div([html.Div(dash_table.DataTable(
                                        id='dinamic_table',
                                        columns=[{"name": i, "id": i} for i in datafortable.columns],
                                        data=datafortable.to_dict("rows")))])
])


@app.callback(dash.dependencies.Output("dinamic_table", "data"),
              [dash.dependencies.Input("salary_budget_2020", 'value')])


def update_table(salary_budget_2020):
    datafortable = data.copy()
    datafortable.at[8, '2020'] = datafortable.at[8, '2020'] - int(salary_budget2020 or 0)

    return datafortable.to_dict('rows')

我想要做的是根据原始值和更新值之间的比较结果设置单元格条件格式。我在文档中找到了“filter_query”,但它不适用于我的更新值变量。

我需要的是能够比较原始值 datafortable.at[8, ‘2020’] 和 datafortable.at[8, ‘2020’] - int(salary_budget2020 or 0) 如果 datafortable.at[8, ‘2020’]

{'if': {'column_id': '2020',"row_index": 8,
'filter_query': 'datafortable.at[8, '2020']  < datafortable.at[8, '2020'] - int(salary_budget2020 or 0)},'backgroundColor': '#3D9970','color': 'white'}

有什么方法可以编码吗?

【问题讨论】:

    标签: python plotly dashboard plotly-dash plotly-python


    【解决方案1】:

    主要问题是您的过滤器不是动态的。 datafortable.at[8, '2020'] 没有在您的过滤器查询中被解释。条件将始终为False,因此您的样式将永远不会被应用。

    一个简单的动态过滤器可能如下所示:

    from dash import Dash
    import pandas as pd
    import dash_table
    
    df = pd.DataFrame({"A": [1, 2, 3]})
    
    x = df.at[1, "A"]
    
    app = Dash(__name__)
    app.layout = dash_table.DataTable(
        data=df.to_dict("records"),
        columns=[{"name": i, "id": i} for i in df.columns],
        style_data_conditional=[
            {
                "if": {"filter_query": f"{{{column}}} = {x}"},
                "backgroundColor": "#3D9970",
                "color": "white",
            }
            for column in df.columns
        ],
    )
    
    
    if __name__ == "__main__":
        app.run_server()
    

    f"{{{column}}} 等于上面示例中的{A}

    f"{x} 等于上面示例中的2

    因此条件格式逻辑为:对于每一列,如果有一个单元格值等于x 的单元格,则应用格式设置。


    在您的回调中,您只是在更新数据。即使过滤器保持不变,如果数据更改,格式也可能会更改。如果过滤器本身也需要根据输入进行更改,您可以在回调中将输出添加到style_data_conditionaldynamic_table。然后你可以应用上面的想法来使过滤器动态化。

    如果您只想在某一行上激活格式,您可以添加

    'row_index': 1
    

    "if" 字典中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多