6

I want to use some pandas style resources and I want to hide table indexes on streamlit.

I tryed this:

import streamlit as st
import pandas as pd


table1 = pd.DataFrame({'N':[10, 20, 30], 'mean':[4.1, 5.6, 6.3]})
st.dataframe(table1.style.hide_index().format(subset=['mean'],
             decimal=',', precision=2).bar(subset=['mean'], align="mid"))

but regardless the .hide_index() I got this:

enter image description here

Ideas to solve this?

Juka
  • 118
  • 1
  • 9
  • better create minimal working code which we could simply copy and run. – furas Nov 07 '21 at 23:27
  • Can't you `table1.set_index('N')` than create `st.dataframe(table1)` ? – AfterFray Nov 08 '21 at 04:48
  • Ok, @furas, I've edited the post so that you can run the code. I'm using pandas 1.3.4 and some features might be recent. – Juka Nov 08 '21 at 12:06
  • @Jamjitul, this works, but the column "N" would have no label. It would be important that the table is properly formatted, with proper headings etc. – Juka Nov 08 '21 at 12:09
  • documentation for [st.dataframe](https://docs.streamlit.io/library/api-reference/data/st.dataframe) shows `"Styler support is experimental!"` and maybe this can be the problem. – furas Nov 08 '21 at 12:42

2 Answers2

5

Documentation for st.dataframe shows "Styler support is experimental!"
and maybe this is the problem.

But I can get table without index if I use .to_html() and st.write()

import streamlit as st
import pandas as pd

df = pd.DataFrame({'N':[10, 20, 30], 'mean':[4.1, 5.6, 6.3]})

styler = df.style.hide_index().format(subset=['mean'], decimal=',', precision=2).bar(subset=['mean'], align="mid")

st.write(styler.to_html(), unsafe_allow_html=True)

#st.write(df.to_html(index=False), unsafe_allow_html=True)

enter image description here

furas
  • 134,197
  • 12
  • 106
  • 148
1

Another option is using a CSS selector to remove the index column. Like explained in the docs, you can do the following with st.table:

# import packages
import streamlit as st
import pandas as pd

# table
table1 = pd.DataFrame({'N':[10, 20, 30], 'mean':[4.1, 5.6, 6.3]})

# CSS to inject contained in a string
hide_table_row_index = """
            <style>
            thead tr th:first-child {display:none}
            tbody th {display:none}
            </style>
            """

# Inject CSS with Markdown
st.markdown(hide_table_row_index, unsafe_allow_html=True)

# Display a static table
st.table(table1.style.format(subset=['mean'],
             decimal=',', precision=2).bar(subset=['mean'], align="mid"))

Output:

enter image description here

As you can see the index is gone. Keep in mind that the table function takes the full page.

Quinten
  • 35,235
  • 5
  • 20
  • 53