pandas 具有特定单元格的单独格式的短划线数据表

5jvtdoz2  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在Dash DataTable中可视化Pandas DataFrame,并希望使用特定颜色**(例如红色或绿色)手动突出显示某些单元格**。
着色取决于一些条件,这些条件不仅取决于单元格本身的值,还取决于相邻值(例如,前一行和下一行之间的差)。
我已经通过了docsreference。从我的理解conditional formatting不允许引入依赖于相邻单元格的值的条件。
有没有办法在Python中使用Pandas DataFrame定义条件,然后相应地格式化Dash DataTable的某些特定单元格?我已经研究了[style_cell property]](https://dash.plotly.com/datatable/style),但这似乎适用于整个表,而不能逐个单元格应用。

编辑:更准确地说,我所寻找的是根据下一行see example in image的单元格值为每个单元格的值着色:

  • 当单元格的值大于下一行中单元格的值时(例如,row1@col1〉row2@col1),则文本颜色应该是绿色(例如,row1@col1)
  • 当单元格的值比下一行中的单元格的值时(例如,row2@col1
  • 当单元格的值等于下一行中单元格的值(例如,row1@col2 = row2@col2)时,则文本颜色不应改变/保持黑色(例如,row1@col2)
hl0ma9xz

hl0ma9xz1#

我想你可以先在panda中找到不同的行,然后用它来设计你的dash datatable。下面是我的代码:

from dash import Dash, dash_table
import pandas as pd
from collections import OrderedDict
import numpy as np
import dash_bootstrap_components as dbc
from dash import Dash, dash_table
import numpy as np
data = OrderedDict(
    [("col1", [3, 1,2]),
     ("col2", [3, 3, 1]),
     ("col3", [1, 3, 3]),
    ])

df = pd.DataFrame(data)
df['col_1_shift'] = df['col1'] - df['col1'].shift(-1)
df['col_2_shift'] = df['col2'] - df['col2'].shift(-1) 
df['col_3_shift'] = df['col3'] - df['col3'].shift(-1) 
df.fillna(0,inplace=True)

下面是df输出:

col1    col2    col3    col_1_shift col_2_shift col_3_shift
0   3   3   1   2.0 0.0 -2.0
1   1   3   3   -1.0    2.0 0.0
2   2   1   3   0.0 0.0 0.0

之后我们将基于col_shift列设置样式:

app = Dash(__name__, external_stylesheets=[dbc.themes.LUX])

#print(df)
app.layout = dash_table.DataTable(
    data=df.to_dict('records'),
    
    #sort_action='native',
    columns=[{'name': i, 'id': i} for i in df.columns[0:3]],
    style_data_conditional=[
        {'if': {'filter_query': '{col_1_shift} > 0',
                'column_id': 'col1'
            },
            'color': 'green'
        },
                {'if': {'filter_query': '{col_1_shift} < 0',
                'column_id': 'col1'
            },
            'color': 'red'
        },
                {'if': {'filter_query': '{col_2_shift} > 0',
                'column_id': 'col2'
            },
            'color': 'green'
        },
                {'if': {'filter_query': '{col_2_shift} < 0',
                'column_id': 'col2'
            },
            'color': 'red'
        },
                {'if': {'filter_query': '{col_3_shift} > 0',
                'column_id': 'col3'
            },
            'color': 'green'
        },
                {'if': {'filter_query': '{col_3_shift} < 0',
                'column_id': 'col3'
            },
            'color': 'red'
        },
        
    ] 
)

if __name__ == '__main__':
    app.run_server(debug=False)

结果如下:

相关问题