posit-dev / great-tables

Make awesome display tables using Python.
https://posit-dev.github.io/great-tables/
MIT License
1.88k stars 70 forks source link

Iterate over multiple columns for common formatting (GT_0.13.0, Polars_1.7.1) #503

Open starzar opened 1 week ago

starzar commented 1 week ago

Prework

Question

  1. How to iterate over multiple columns for common formatting on cells eg. converting all float values to int's, showing positive/negative numbers with green/red colors (Polars)?

    fmt example for iterating over multiple columns does not work in this case .

  2. Also GT.show() import raises an import error .How to resolve this?

ERROR:

  loc.body(lambda x: x > 0 , columns= df_columns)  # fmt example https://posit-dev.github.io/great-tables/reference/GT.fmt.html#examples
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: LocBody.__init__() got multiple values for argument 'columns'

CODE:


import polars as pl
from great_tables import GT,loc,style

df = pl.DataFrame({
    "A": [10, -5, 20, -15],
    "B": [30.32234, 25.234234, -10.234234, 15.23423],
})

df_columns = df.columns

# Not supported on polars df
df_gt = GT(df)

filtered_df_gt = (
    df_gt
    .tab_style(
        style.fill("green"),
        loc.body(lambda x: x > 0 , columns= df_columns)  # fmt example https://posit-dev.github.io/great-tables/reference/GT.fmt.html#examples
    )
)
# ImportError: cannot import name 'show' from 'great_tables'
# df.show()

html_output = filtered_df_gt.as_raw_html()

html_path = "secondTerminal.html"
with open(html_path, "w") as file:
    file.write(html_output)
jrycw commented 1 week ago

@starzar , with Polars DataFrames, it’s often best to use Polars expressions for operations. There’s an example showing how to do this with a single column, but for multiple columns, we may need to loop through each to perform the desired operations. For instance:

import polars as pl
from great_tables import GT, loc, style

df = pl.DataFrame(
    {
        "A": [10, -5, 20, -15],
        "B": [30.32234, 25.234234, -10.234234, 15.23423],
    }
)

df_gt = GT(df)

for col in df.columns:
    df_gt = df_gt.tab_style(
        style=style.fill(
            (pl.when(pl.col(col) > 0).then(pl.lit("green")).otherwise(pl.lit("red")))
        ),
        locations=loc.body(columns=col),
    )

df_gt.show()

html_output = df_gt.as_raw_html()

html_path = "secondTerminal.html"
with open(html_path, "w") as file:
    file.write(html_output)

Image

For required packages, if you’re using Jupyter Notebook/Lab, be sure to install great_tables[extra], ipykernel, and polars.

machow commented 3 days ago

Thanks for the polars example @jrycw !

@starzar RE the .show() method, can you post what import great_tables; great_tables.__version__ gives? And the full import error stacktrace, if you can produce? I'm trying to figure out what might cause that..