pandas で DataFrame を csv ファイルに書き出すには to_csv という関数を使う。次のコードがシンプルな結論だ。
df.to_csv('out.csv', sep=',', encoding='utf-8')
例
前回は東京都の人口データを使って、女性が男性よりも 1.1 倍多い 10 万人以上の自治体を選択した。
import pandas as pd
df = pd.read_csv('population.csv', thousands=',')
rows = df.loc[(df['総数'] > 100000) & (df['女'] > df['男'] * 1.1)]
rows には次のデータがある。
市区町村 世帯数 総数 男 女 人口密度
1 中央区 91852 162502 77241 85261 15916
2 港 区 145865 257426 121326 136100 12638
4 文京区 121128 221489 105462 116027 19618
9 目黒区 156583 279342 132206 147136 19042
11 世田谷区 479792 908907 431026 477881 15657
これを out.csv に書き出してみよう。といっても 1 行追加するだけ。
import pandas as pd
df = pd.read_csv('population.csv', thousands=',')
rows = df.loc[(df['総数'] > 100000) & (df['女'] > df['男'] * 1.1)]
rows.to_csv('out.csv', sep=',', encoding='utf-8')
これでファイルが書き出される。
,市区町村,世帯数,総数,男,女,人口密度
1,中央区,91852,162502,77241,85261,15916
2,港 区,145865,257426,121326,136100,12638
4,文京区,121128,221489,105462,116027,19618
9,目黒区,156583,279342,132206,147136,19042
11,世田谷区,479792,908907,431026,477881,15657
左に数値が出てしまっている。これはもとの DataFrame のインデックスである。
pandas の to_csv でインデックスを消す
to_csv のオプション引数で index=False をつけると、書き出したファイルからインデックスが消える。
import pandas as pd
df = pd.read_csv('population.csv', thousands=',')
rows = df.loc[(df['総数'] > 100000) & (df['女'] > df['男'] * 1.1)]
rows.to_csv('out.csv', sep=',', encoding='utf-8', index=False)
print(rows)
書き出したファイルの中身。インデックスが消えている。
市区町村,世帯数,総数,男,女,人口密度
中央区,91852,162502,77241,85261,15916
港 区,145865,257426,121326,136100,12638
文京区,121128,221489,105462,116027,19618
目黒区,156583,279342,132206,147136,19042
世田谷区,479792,908907,431026,477881,15657
ダブルクォーテーションで要素を囲う
上の例ではデータがむき出しになっている。ダブルクォーテーションでデータを囲うには、次のように quotechar と quoting を設定する。
import pandas as pd
import csv
df = pd.read_csv('population.csv', thousands=',')
rows = df.loc[(df['総数'] > 100000) & (df['女'] > df['男'] * 1.1)]
rows.to_csv('out.csv', sep=',', encoding='utf-8', index=False, quotechar='"', quoting=csv.QUOTE_ALL)
print(rows)
ヘッダーも含めてすべてダブルクォーテーションで囲まれた。
"市区町村","世帯数","総数","男","女","人口密度"
"中央区","91852","162502","77241","85261","15916"
"港 区","145865","257426","121326","136100","12638"
"文京区","121128","221489","105462","116027","19618"
"目黒区","156583","279342","132206","147136","19042"
"世田谷区","479792","908907","431026","477881","15657"
ポイント: quoting と quotechar でダブルクォーテーション