pandasの表示設定変更(小数点以下桁数、有効数字、最大行数・列数など)
pandas.DataFrame
, pandas.Series
をprint()
関数などで表示する場合の設定(小数点以下桁数、有効数字、最大行数・列数など)を変更する方法を説明する。
設定値の確認・変更・リセットなどの方法についての詳細は以下の記事を参照。設定の変更は同一コード(スクリプト)内でのみ有効。恒久的に書き換わるわけではなく、別のコードではまたデフォルト設定となる。同一コード中でもwith
ブロックの中で一時的に設定を変更したりできる。
- 関連記事: pandasのオプション設定を確認・変更する方法
ここで説明するのはあくまでも表示時の設定で、元のデータの値自体は変更されない。数値を四捨五入で丸めたり書式を指定した文字列に変換したりしたい場合は以下の記事を参照。
- 関連記事: pandasで数値を丸める(四捨五入、偶数への丸め)
- 関連記事: pandasで文字列と数値を相互変換、書式変更
以下のライブラリをインポート。NumPyはpandas.DataFrame
の生成のために使う。pandasのバージョンが違うと設定のデフォルト値などが違う場合があるので注意。
import pandas as pd
import numpy as np
print(pd.__version__)
# 0.23.0
設定項目の一覧については公式ドキュメントを参照。
ここでは表示関係の主な項目について説明する
- 小数点以下の桁数:
display.precision
- 有効数字(有効桁数):
display.float_format
- 四捨五入についての注意
- 最大表示行数:
display.max_rows
- 最大表示列数:
display.max_columns
- 省略時の行数・列数表示:
display.show_dimensions
- 全体の最大表示幅:
display.width
- 列ごとの最大表示幅:
display.max_colwidth
- 列名表示の右寄せ・左寄せ:
display.colheader_justify
- Jupyter Notebookでの表示設定
小数点以下の桁数: display.precision
小数点以下の桁数はdisplay.precision
で設定する。
デフォルトは6
で、整数部分の桁数によらず小数点以下が指定した桁数になる。省略されて表示されているだけで元のデータの値は以降の桁の情報も保持している。
print(pd.options.display.precision)
# 6
s_decimal = pd.Series([123.456, 12.3456, 1.23456, 0.123456, 0.0123456, 0.00123456])
print(s_decimal)
# 0 123.456000
# 1 12.345600
# 2 1.234560
# 3 0.123456
# 4 0.012346
# 5 0.001235
# dtype: float64
print(s_decimal[5])
# 0.00123456
display.precision
の設定値によって書式(表示形式)が変わって指数表記になったりする。
pd.options.display.precision = 4
print(s_decimal)
# 0 123.4560
# 1 12.3456
# 2 1.2346
# 3 0.1235
# 4 0.0123
# 5 0.0012
# dtype: float64
pd.options.display.precision = 2
print(s_decimal)
# 0 1.23e+02
# 1 1.23e+01
# 2 1.23e+00
# 3 1.23e-01
# 4 1.23e-02
# 5 1.23e-03
# dtype: float64
書式を制御したい場合は次に説明するdisplay.float_format
を使う。
有効数字(有効桁数): display.float_format
display.precision
で設定できるのは小数点以下の桁数で、整数部も含む有効数字(有効桁数)を指定したい場合はdisplay.float_format
を使う。デフォルトはNone
。
print(pd.options.display.float_format)
# None
display.float_format
には浮動小数点float
型を任意の書式の文字列に変換する呼び出し可能オブジェクト(関数やメソッドなど)を指定する。基本的には文字列メソッドformat()
を指定すると考えていい。
format()
についての詳細は以下の記事を参照。
書式指定文字列'.[桁数]f'
で小数点以下の桁数、'.[桁数]g'
で全体の桁数(有効数字)を指定できる。
pd.options.display.float_format = '{:.2f}'.format
print(s_decimal)
# 0 123.46
# 1 12.35
# 2 1.23
# 3 0.12
# 4 0.01
# 5 0.00
# dtype: float64
pd.options.display.float_format = '{:.4g}'.format
print(s_decimal)
# 0 123.5
# 1 12.35
# 2 1.235
# 3 0.1235
# 4 0.01235
# 5 0.001235
# dtype: float64
表示される桁数を揃えたい場合は'.[桁数]e'
で指数表記にする。整数部が常に1桁となるので有効数字は設定した桁数+1
となる。
pd.options.display.float_format = '{:.4e}'.format
print(s_decimal)
# 0 1.2346e+02
# 1 1.2346e+01
# 2 1.2346e+00
# 3 1.2346e-01
# 4 1.2346e-02
# 5 1.2346e-03
# dtype: float64
任意の書式指定文字列を使えるので、以下のように左寄せなどのアラインメントやパーセント表示も可能。書式指定の方法などの詳細は上記format()
の関連記事を参照。
pd.options.display.float_format = '{: <10.2%}'.format
print(s_decimal)
# 0 12345.60%
# 1 1234.56%
# 2 123.46%
# 3 12.35%
# 4 1.23%
# 5 0.12%
# dtype: float64
四捨五入についての注意
display.precision
, display.float_format
では値が丸められるが、一般的な四捨五入ではなく偶数への丸めとなり、例えば0.5
は0
に丸められる。
df_decimal = pd.DataFrame({'s': ['0.4', '0.5', '0.6', '1.4', '1.5', '1.6'],
'f': [0.4, 0.5, 0.6, 1.4, 1.5, 1.6]})
pd.options.display.float_format = '{:.0f}'.format
print(df_decimal)
# s f
# 0 0.4 0
# 1 0.5 0
# 2 0.6 1
# 3 1.4 1
# 4 1.5 2
# 5 1.6 2
さらに小数点以下で丸める場合は、値によって偶数への丸めになったり奇数への丸めになったりする。
df_decimal2 = pd.DataFrame({'s': ['0.04', '0.05', '0.06', '0.14', '0.15', '0.16'],
'f': [0.04, 0.05, 0.06, 0.14, 0.15, 0.16]})
pd.options.display.float_format = '{:.1f}'.format
print(df_decimal2)
# s f
# 0 0.04 0.0
# 1 0.05 0.1
# 2 0.06 0.1
# 3 0.14 0.1
# 4 0.15 0.1
# 5 0.16 0.2
これは浮動小数点の扱いに起因するもの。
注釈 浮動小数点数に対する round() の振る舞いは意外なものかもしれません: 例えば、 round(2.675, 2) は予想通りの 2.68 ではなく 2.67 を与えます。これはバグではありません: これはほとんどの小数が浮動小数点数で正確に表せないことの結果です。
2. 組み込み関数 — Python 3.6.5 ドキュメント
標準ライブラリのdecimalモジュールを使うと正確に四捨五入できる。以下の記事を参照。
最大表示行数: display.max_rows
最大表示行数はdisplay.max_rows
で設定する。display.max_rows
の値を超える行数の場合、中間が省略されて先頭と末尾が表示される。
デフォルトは60
。
print(pd.options.display.max_rows)
# 60
df_tall = pd.DataFrame(np.arange(300).reshape((100, 3)))
pd.options.display.max_rows = 10
print(df_tall)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
# 3 9 10 11
# 4 12 13 14
# .. ... ... ...
# 95 285 286 287
# 96 288 289 290
# 97 291 292 293
# 98 294 295 296
# 99 297 298 299
# [100 rows x 3 columns]
先頭や末尾だけを表示したい場合はhead()
やtail()
を使う。この場合もdisplay.max_rows
の値を超える行数の場合は中間が省略される。
print(df_tall.head(10))
# 0 1 2
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
# 3 9 10 11
# 4 12 13 14
# 5 15 16 17
# 6 18 19 20
# 7 21 22 23
# 8 24 25 26
# 9 27 28 29
print(df_tall.head(20))
# 0 1 2
# 0 0 1 2
# 1 3 4 5
# 2 6 7 8
# 3 9 10 11
# 4 12 13 14
# .. .. .. ..
# 15 45 46 47
# 16 48 49 50
# 17 51 52 53
# 18 54 55 56
# 19 57 58 59
# [20 rows x 3 columns]
None
とすると省略されず全ての行が表示される。
pd.options.display.max_rows = None
最大表示列数: display.max_columns
最大表示列数はdisplay.max_columns
で設定する。display.max_columns
の値を超える列数の場合、中間が省略されて先頭と末尾が表示される。
デフォルトは20
で、None
とすると省略されず全ての列が表示される。
print(pd.options.display.max_columns)
# 20
df_wide = pd.DataFrame(np.arange(90).reshape((3, 30)))
print(df_wide)
# 0 1 2 3 4 5 6 7 8 9 ... 20 21 22 23 24 25 26 27 \
# 0 0 1 2 3 4 5 6 7 8 9 ... 20 21 22 23 24 25 26 27
# 1 30 31 32 33 34 35 36 37 38 39 ... 50 51 52 53 54 55 56 57
# 2 60 61 62 63 64 65 66 67 68 69 ... 80 81 82 83 84 85 86 87
# 28 29
# 0 28 29
# 1 58 59
# 2 88 89
# [3 rows x 30 columns]
pd.options.display.max_columns = 10
print(df_wide)
# 0 1 2 3 4 ... 25 26 27 28 29
# 0 0 1 2 3 4 ... 25 26 27 28 29
# 1 30 31 32 33 34 ... 55 56 57 58 59
# 2 60 61 62 63 64 ... 85 86 87 88 89
# [3 rows x 30 columns]
pd.options.display.max_columns = None
print(df_wide)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \
# 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 1 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
# 2 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
# 19 20 21 22 23 24 25 26 27 28 29
# 0 19 20 21 22 23 24 25 26 27 28 29
# 1 49 50 51 52 53 54 55 56 57 58 59
# 2 79 80 81 82 83 84 85 86 87 88 89
全体の表示幅はdisplay.width
で設定する。後述。
また、ターミナルで実行されている場合はdisplay.max_columns
のデフォルト値が0
になりターミナルの幅に応じて自動的に省略されるようになる。
省略時の行数・列数表示: display.show_dimensions
これまでの例のように、行や列が省略して表示された場合は末尾に[3 rows x 30 columns]
のように行数と列数が表示される。
この振る舞いはdisplay.show_dimensions
で設定できる。デフォルトは'truncate'
で省略時のみ行数・列数が表示される。
print(pd.options.display.show_dimensions)
# truncate
pd.options.display.max_columns = 10
print(df_wide)
# 0 1 2 3 4 ... 25 26 27 28 29
# 0 0 1 2 3 4 ... 25 26 27 28 29
# 1 30 31 32 33 34 ... 55 56 57 58 59
# 2 60 61 62 63 64 ... 85 86 87 88 89
# [3 rows x 30 columns]
df = pd.DataFrame(np.arange(12).reshape((3, 4)))
print(df)
# 0 1 2 3
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
True
とすると省略に関わらず常に表示、False
とすると常に非表示になる。
pd.options.display.show_dimensions = True
print(df_wide)
# 0 1 2 3 4 ... 25 26 27 28 29
# 0 0 1 2 3 4 ... 25 26 27 28 29
# 1 30 31 32 33 34 ... 55 56 57 58 59
# 2 60 61 62 63 64 ... 85 86 87 88 89
# [3 rows x 30 columns]
print(df)
# 0 1 2 3
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
# [3 rows x 4 columns]
pd.options.display.show_dimensions = False
print(df_wide)
# 0 1 2 3 4 ... 25 26 27 28 29
# 0 0 1 2 3 4 ... 25 26 27 28 29
# 1 30 31 32 33 34 ... 55 56 57 58 59
# 2 60 61 62 63 64 ... 85 86 87 88 89
print(df)
# 0 1 2 3
# 0 0 1 2 3
# 1 4 5 6 7
# 2 8 9 10 11
全体の最大表示幅: display.width
全体の最大表示幅はdisplay.width
で設定する。
デフォルトは80
。display.width
はNone
としても全体を表示にはならない。
print(pd.options.display.width)
# 80
pd.options.display.max_columns = None
print(df_wide)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \
# 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 1 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
# 2 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
# 19 20 21 22 23 24 25 26 27 28 29
# 0 19 20 21 22 23 24 25 26 27 28 29
# 1 49 50 51 52 53 54 55 56 57 58 59
# 2 79 80 81 82 83 84 85 86 87 88 89
pd.options.display.width = 60
print(df_wide)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 \
# 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13
# 1 30 31 32 33 34 35 36 37 38 39 40 41 42 43
# 2 60 61 62 63 64 65 66 67 68 69 70 71 72 73
# 14 15 16 17 18 19 20 21 22 23 24 25 26 27 \
# 0 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 1 44 45 46 47 48 49 50 51 52 53 54 55 56 57
# 2 74 75 76 77 78 79 80 81 82 83 84 85 86 87
# 28 29
# 0 28 29
# 1 58 59
# 2 88 89
pd.options.display.width = None
print(df_wide)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \
# 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 1 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
# 2 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
# 19 20 21 22 23 24 25 26 27 28 29
# 0 19 20 21 22 23 24 25 26 27 28 29
# 1 49 50 51 52 53 54 55 56 57 58 59
# 2 79 80 81 82 83 84 85 86 87 88 89
列ごとの最大表示幅: display.max_colwidth
列ごとの最大表示幅はdisplay.max_colwidth
で設定する。
デフォルトは50
。
print(pd.options.display.max_colwidth)
# 50
df_long_col = pd.DataFrame({'col': ['a' * 10, 'a' * 30, 'a' * 60]})
print(df_long_col)
# col
# 0 aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
pd.options.display.max_colwidth = 80
print(df_long_col)
# col
# 0 aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
各列がdisplay.max_colwidth
の設定値に収まるように省略される。
df_long_col2 = pd.DataFrame({'col1': ['a' * 10, 'a' * 30, 'a' * 60],
'col2': ['a' * 10, 'a' * 30, 'a' * 60]})
pd.options.display.max_colwidth = 20
print(df_long_col2)
# col1 col2
# 0 aaaaaaaaaa aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaa... aaaaaaaaaaaaaaaa...
# 2 aaaaaaaaaaaaaaaa... aaaaaaaaaaaaaaaa...
列名columns
はdisplay.max_colwidth
の対象にならず省略されない。
df_long_col_header = pd.DataFrame({'a' * 60: ['a' * 10, 'a' * 30, 'a' * 60]})
pd.options.display.max_colwidth = 40
print(df_long_col_header)
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 0 aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
列名表示の右寄せ・左寄せ: display.colheader_justify
列名表示の右寄せ・左寄せはdisplay.colheader_justify
で設定する。
デフォルトは'right'
。左寄せにしたい場合は'left'
とする。
print(pd.options.display.colheader_justify)
# right
print(df_long_col)
# col
# 0 aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
pd.options.display.colheader_justify = 'left'
print(df_long_col)
# col
# 0 aaaaaaaaaa
# 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
Jupyter Notebookでの表示設定
ここまでprint()
での表示を例としてきた。
Jupyter Notebookではprint()
を使わなくても変数名などを記述するだけでオブジェクトの中身が表示される。特にpandas.DataFrame
はhtmlの表できれいに表示されるので非常に見やすく便利。
上述の最大表示行数、列数などの設定はJupyter Notebookでのhtml表示時にも反映される。
display.notebook_repr_html
をFalse
とするとpandas.DataFrame
もhtmlの表ではなくprint()
での出力のようにテキストで表示される。