pandasでデータフレームの内容を表示するとき、大きな桁数の数字を3桁区切りで表現する方法を紹介します。
JupyterNotebookやJupyterLabを使っていて、データを人に見せたい人は要チェックの内容です!
データを3桁区切りで表示してみる
こんな感じで、桁数の大きな数字が入っているデータフレームがあったとしましょう。
import pandas as pd
from numpy.random import default_rng
rng = default_rng()
df = pd.DataFrame(
rng.integers(100_000, 100_000_000, (6, 4)),
columns=['A', 'B', 'C', 'D'])
df

普通にJupyterで表示しただけでは、3桁区切りもされていなくて読みにくいですね。
読みやすくするためには、データフレームのスタイルオブジェクトに対してフォーマット文字列の指定をします。
s = df.style
s.format('{:,d}')
s

DataFrame.styleにアクセスすることで、スタイルオブジェクトを得ることができます。
このスタイルオブジェクトは、s.format('{:,d}')
のように書式を指定することができます。書式はstr.format()で採用されているFormat String Syntaxと同じルールです。
実際のデータを変更するわけではないので、その後のデータフレームに対する計算なんかの悪影響にはなりません。
ついでに他にも実務に役立つ書式設定をしてみる
3桁区切りで表示する以外にも、小数点以下桁数の指定や数字の単位表示もしたくなると思うので、そこもついでにやってしまいましょう。
ということで次はこんな感じの収支を想定したデータを使います。
import pandas as pd
from numpy.random import default_rng
rng = default_rng()
df = pd.DataFrame(
rng.random((6, 2)) * 100_000,
columns=['売り上げ', '原価'])
df['利益'] = df['売り上げ'] - df['原価']
df

「お金のデータなのに少数の桁がめっちゃあるやん!」って突っ込んだら負けですよ?
このデータを
- 3桁区切り
- 小数点以下2桁に丸め
- 単位「円」を表示
にしてみましょう。
s = df.style
s.format('{:,.2f}円')

かなり見栄えが良くなりましたね!会社での報告にも十分使えそうです。
でももう少し欲張ると、フォーマットだけでなくスタイルの指定なんかもすることができます。
- マイナスの利益は赤字に
- 利益の左側に線を
- 利益の文字を太字に
といったスタイルを指定してみましょう。
s.applymap(lambda x: 'color:red;' if x < 0 else '')
s.set_table_styles({
'利益': [
{'selector': '*', 'props': 'border-left: 1px solid gray; font-weight:bold;'},
],
})

どうですか、かなり見やすくなりました!