Irohabook
0
12114

pandasでDataFrameをcsvファイルに書き出す(to_csv):インデックスのありなしに注意しよう

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')

これでファイルが書き出される。

pandas to_csv
,市区町村,世帯数,総数,男,女,人口密度
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 でダブルクォーテーション

次の記事

pandas