pandas DataFrameをエクセルで開いても文字化けしないcsvファイルに書き出す

pandasのDataFrameをファイルに保存したい時、
to_csvやto_excelなど、とても便利なメソッドが用意されています。

pandas.DataFrame.to_csv
pandas.DataFrame.to_excel

ただ、日本語文字を含むデータフレームをto_csvで書き出すと、
それをエクセルで開いたときに文字化けしてしまいます。
(他職種のメンバーに連携するとき非常に厄介な現象です。)

エクセルで開きたいなら to_excel() を使えばいいので、普段はそれでクリアしているのですが、
データ量やその後の用途の問題で、csvファイルで要求されるが、その人はエクセルでも使うといったパターンがあります。

このような時は、 encoding="utf-8_sig"を指定することで文字化けしないようにできます。
(pandasにとってExcelはスコープ外だからか、公式ドキュメントにはこの辺りのことを明記している記述は見つかりませんでした)


import pandas as pd
df = pd.DataFrame(
        {
            'col1': ["あ", "い", "う", "え", "お"],
            'col2': ["か", "き", "く", "け", "こ"],
        }
    )
df.to_csv("export_1.csv", index=None)
df.to_csv("export_2.csv", encoding="utf-8_sig", index=None)

# jupyter で実行しているので、!をつけることでBashコマンドを実行
!ls -la *.csv
-rw-r--r--@ 1 yutaro  staff  50  5 25 01:25 export_1.csv
-rw-r--r--@ 1 yutaro  staff  53  5 25 01:25 export_2.csv

2つのファイルを見比べると、 encoding=”utf-8_sig” をつけた方は 3バイトファイルサイズが大きいことがわかります。
これは、BOM(バイトオーダーマーク)と呼ばれる情報が付加されたためで、
これによって、 export_2.csv の方はExcelで開いても文字化けしなくなります。
(export_1.csv は文字化けします。)