静かなる名辞

pythonとプログラミングのこと


DataFrameをprintしたときヘッダの日本語の列名がずれないようにする

 日本語の列名のDataFrameを扱うことは、日本人のpandasユーザにとってはありがちな展開だと思うのですが、問題はprintするとヘッダがずれてしまうことです。

>>> import pandas as pd
>>> pd.DataFrame({"あああ":[1, 2], "いいい":[3, 4], "ううう":[5, 6], "えええ":[7, 8]})
   あああ  いいい  ううう  えええ
0    1    3    5    7
1    2    4    6    8

 ASCIIの等幅文字を前提にしているからこんなものなのだろうと諦めていましたが、実はよしなに表示するオプションがありました。teratailでこの件の質問を見かけて、ふと久々にリファレンスを見たら見つけました。こういうことがあるからQAサイトは楽しいのです。

Some East Asian countries use Unicode characters whose width corresponds to two Latin characters. If a DataFrame or Series contains these characters, the default output mode may not align them properly.
(中略)
Enabling display.unicode.east_asian_width allows pandas to check each character’s “East Asian Width” property. These characters can be aligned properly by setting this option to True. However, this will result in longer render times than the standard len function.
Options and settings — pandas 1.0.3 documentation

 うまく表示してもらうためには、

pd.set_option('display.unicode.east_asian_width', True)

 を打ちます。東アジアで使われている文字幅で表示してあげますよというオプション名。要するに我々のためにあるようなものなので、ありがたく使わせてもらいましょう。

 このようにうまくいきます。

>>> pd.set_option('display.unicode.east_asian_width', True)
>>> pd.DataFrame({"あああ":[1, 2], "いいい":[3, 4], "ううう":[5, 6], "えええ":[7, 8]})
   あああ  いいい  ううう  えええ
0       1       3       5       7
1       2       4       6       8

(といいつつ、ブラウザ環境次第ですがこのブログ記事上ではうまく見えていない可能性が高いです。全角文字をきっちり半角文字二文字分の幅で表示してくれる環境で確認してください。)

 なお、これはPythonを起動する度に毎回設定する必要があります。永続化させるために、Pythonのスタートアップ時にpandasをimportして走らせる方法が公式では推奨されています。

Options and settings — pandas 1.0.3 documentation

 素のCPythonならPYTHONSTARTUP、IPythonなら$IPYTHONDIR/profile_default/startupなどに仕掛けておけとのことですが、そのためだけにpandasをimportさせるのも微妙な感じですね。そこだけは残念なところです。

1. コマンドラインと環境 — Python 3.8.2 ドキュメント
PYTHONSTARTUP で Python のインタラクティブシェルを便利にする | まくまくPythonノート
IPython起動時にいつも使うモジュールをimportする設定 - Qiita