note.nkmk.me

pandasの表示設定変更(小数点以下桁数、有効数字、最大行数・列数など)

Date: 2018-06-15 / tags: Python, pandas

pandas.DataFrame, pandas.Seriesprint()関数などで表示する場合の設定(小数点以下桁数、有効数字、最大行数・列数など)を変更する方法を説明する。

設定値の確認・変更・リセットなどの方法についての詳細は以下の記事を参照。設定の変更は同一コード(スクリプト)内でのみ有効。恒久的に書き換わるわけではなく、別のコードではまたデフォルト設定となる。同一コード中でもwithブロックの中で一時的に設定を変更したりできる。

ここで説明するのはあくまでも表示時の設定で、元のデータの値自体は変更されない。数値を四捨五入で丸めたり書式を指定した文字列に変換したりしたい場合は以下の記事を参照。

以下のライブラリをインポート。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.50に丸められる。

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で設定する。

デフォルトは80display.widthNoneとしても全体を表示にはならない。

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...

列名columnsdisplay.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_htmlFalseとするとpandas.DataFrameもhtmlの表ではなくprint()での出力のようにテキストで表示される。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事