英文:
Highlight row based in streamlit
问题
I can help you with the translation. Here's the translated content:
我似乎找不到对我的问题的具体答案,因为我不确定是否可以使用 apply 或 applymap 完成。
我有一个参数数据框,让我们称之为 x。我有一个原始数据框,让我们称之为 y。
y = pd.DataFrame({"a": {"h":0.5,"x": 2, "y": 1}, "b": {"h":15,"x": 20, "y": 6}})
x = pd.DataFrame({"thres1": {"x": 2, "h": 1,"y":3}, "thres2": {"x": 10, "h": 12,"y":3}})
x 提供了阈值,如果原始数据的某列超过了这些阈值,将需要突出显示该行。请注意,需要将 y 中的行与 x 中的正确行进行比较,考虑到行索引。可能会出现 x 拥有比 y 更多行的情况(但不会反过来,因此我们需要确保使用 .loc 来匹配正确的行。
例如,我想比较原始数据框 y 中的列 "b" 与原始数据框 x 中的列 "thres2"。对于 y 中列 "b" 的第一行,其值为 15。我需要将 15 与 x 的第二行第二列进行比较,其值为 12。因为它更大,所以我需要突出显示它。
apply 应用于整个数据框,而 applymap 逐个单元格应用。问题是我需要在之前使用 .loc。在Streamlit中,如何为此设置数据框的样式?(最好不使用 JSON)
更新:我试图突出显示行索引 "B",但没有成功。这是一个尝试执行此操作的示例应用程序:
import streamlit as st
import pandas as pd
import numpy as np
def MainDashboard():
st.sidebar.title("Test")
df = pd.DataFrame([[1,2], [3,4]], index=["A", "B"])
def color_b(s):
return np.where(s == "B", "background-color: yellow;", "")
df.style.apply_index(color_b)
st.dataframe(df)
if __name__ == '__main__':
MainDashboard()

1: https://i.stack.imgur.com/JeL2G.png
英文:
I can't seem to find any specific answers to my question as I'm not sure if it can be done with apply or applymap.
I have a parameter dataframe, lets call it x. I have a raw data frame, lets call it y.
y = pd.DataFrame({"a": {"h":0.5,"x": 2, "y": 1}, "b": {"h":15,"x": 20, "y": 6}})
x = pd.DataFrame({"thres1": {"x": 2, "h": 1,"y":3}, "thres2": {"x": 10, "h": 12,"y":3}})
x provides the thresholds where if certain column of raw data exceeds, will require the row to be highlighted. Note the rows in y needs to be compared to the correct rows in x given the row indexes. There can be situations where x will have more rows than y, (but not the other way around, so we need to make sure we .loc to match the correct row.
so for example, I want to compare column "b" in raw dataframe y to column 'thres2" in raw dataframe x. for the first row of y in column "b", its 15. I need to compare 15 to the second row second column of x which is 12. Because its bigger, I need to highlight that.
apply apply the entire dataframe while applymap does cell by cell. Issue is I need to do .loc before. How would styling the dataframe work for this in streamlit? (preferably without json please)
Update: I'm trying to get the row index "B" to highlight but it doesn't. Here is an example app that tries to do this:
import streamlit as st
import pandas as pd
import numpy as np
def MainDashboard():
st.sidebar.title("Test")
df = pd.DataFrame([[1,2], [3,4]], index=["A", "B"])
def color_b(s):
return np.where(s == "B", "background-color: yellow;", "")
df.style.apply_index(color_b)
st.dataframe(df)
if __name__ == '__main__':
MainDashboard()
答案1
得分: 1
使用Styler.apply与axis=None一起使用以传递整个DataFrame,要进行比较需要具有相同的列和索引标签,因此使用DataFrame.set_axis来重命名x.columns:
import streamlit as st
highlight_greater = lambda z: pd.DataFrame(np.where(z.gt(x.set_axis(z.columns, axis=1)),
'background-color:red',
''), index=z.index, columns=z.columns)
styled = y.style.apply(highlight_greater, axis=None)
st.table(styled)
理解后的用法:
highlight_greater = lambda z: np.where(y.gt(x.set_axis(z.columns, axis=1)).any(axis=1),
'background-color:red', '')
df.style.apply_index(highlight_greater)
英文:
Use Styler.apply with axis=None for pass entire DataFrame, for compare need same columns and index labels, so rename x.columns by DataFrame.set_axis:
import streamlit as st
highlight_greater = lambda z: pd.DataFrame(np.where(z.gt(x.set_axis(z.columns, axis=1)),
'background-color:red',
''), index=z.index, columns=z.columns)
styled = y.style.apply(highlight_greater, axis=None)
st.table(styled)
IIUC use:
highlight_greater = lambda z: np.where(y.gt(x.set_axis(z.columns, axis=1)).any(axis=1),
'background-color:red', '')
df.style.apply_index(highlight_greater)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论