[241008 コピペミスって一部変数が機能していなかったなどについて修正]
plやpdのdfをjupyterでdisplayした際に、
日本語の自動折り返しがめちゃくちゃで行高がえらいことになって
イライラすることが度々あったので、対応関数を作成してみた。
white-space: nowrap !important;
を与えることで、
セル内での改行/折り返しを抑制させている。
pandasに限れば d1.to_pandas().style.set_table_styles([{'selector': 'td', 'props': 'white-space: nowrap !important;'}])
という手もあるが、
これはpd.optionのmax_colwidthでは制御できず、
改行/折り返し無しだと横にとんでもない長さとなることがあるため却下。
from IPython.display import display_html
import pandas as pd
import polars as pl
import datetime
def display_df(df, max_rows = 30, max_strlen = 50):
"""
plかpdのDataFrameをセル内改行を抑止してdisplayする。
Args:
df (pl.DataFrame|pd.DataFrame|dict): plかpdのDataFrame
max_rows (int): 表示させる最大行数 (これ以上だと間に...が入る)
max_strlen (int): 表示させる最大文字数 (これ以上だと...になる)
"""
tbl_id = "T_" + datetime.datetime.now().strftime("%m%d%H%M%S%f")
new_style = '<style type="text/css">\n#' + tbl_id + ' td, th {\n white-space: nowrap !important;\n}\n</style>'
with pd.option_context("display.max_rows", max_rows, "display.max_colwidth", max_strlen + 1):
with pl.Config(tbl_rows = max_rows, fmt_str_lengths = max_strlen):
raw_html = df._repr_html_()
html_ = re.sub("<style.*?</style>", new_style, raw_html, flags = (re.MULTILINE | re.DOTALL))
html_ = re.sub('<table', f'<table id="{tbl_id}"', html_, 1)
display_html(html_, raw = True)
pass
example:
d1 = pd.DataFrame({"aa": ["aaaaaaaaaaaaaa"],
"bb": ["日本語の文字はうまく折り返されない。"],
"cc": ["aaaaaaa bbbbbbbb"],
"dd": ["aaaaa bbbbbbbb cccccccc"],
"ee": ["aaaaaaa bbbbb cccccccc dddd"]})
display(d1)
display_df(d1)