PythonのPandasでCSVを読み込み・書き出しする実践テクニック集

pandas-csv-readto

SPONSORED LINK

こんにちは、データサイエンティストのたぬ(@tanuhack)です!

ある特定のWebサイトからファイルをダウンロードした際、最も多いフォーマットはCSVファイルだと思います。

CSVファイルの補足

Comma Separated Valuesの略。要は、中身のデータがカンマで区切られたテキストファイルのことをCSVと言います。

PythonでCSVを操作するメリットは、CSVファイルを直接開いて処理する訳ではないので、非常に高速に作業を行うことが出来ることです。

PandasのCSV操作の流れ
  1. CSVファイルの中身を、Pandasのデータフレームに格納する
  2. データフレーム上で色んな操作をする
  3. 色々操作したデータフレームを新たなCSVファイルとして書き出す

複数のCSVを一気に操作したり、cronを使って自動で定時実行したりと、PandasのCSV操作は人間の手作業を遥かに凌駕したスピードで処理することが出来ます。

この機会に、PandasのCSV操作をマスターしてみて下さい。ちなみに私は、CSV操作を手作業でやろうなんて微塵も感じてないです。すっかりPandasの虜になりました。

以下、紹介するプログラムは、import pandas as pdでインポートしたものとして進めていきますね。

CSVを読み込む

pandas-csv-readto1

pd.read_csvでcsvファイルの中身をPandasのデータフレームに格納します。

# CSVファイルを読み込む
df = pd.read_csv('フルパス')

わざわざフルパスを指定している理由は、cronを使って定時実行させるとき、相対パスからフルパスに書き換えるのが面倒だからです。

read_csvの実践テクニック

CSVを読み込むときのポイント
  1. 読み込むCSVに日本語の値があるかどうか
  2. 読み込むCSVに0から始まる郵便番号や電話番号が値があるかどうか
  3. 読み込むCSVにヘッダー(列見出し)やインデックス(行見出し)があるかどうか

CASE1:読み込むCSVに日本語が含まれる場合

取り込むCSVファイルの中に日本語が含まれている場合、データフレームの値が文字化けします。

対策として、pd.read_csvの引数encoding='cp932'で、日本語が扱える文字コードを設定します。

# encoding='cp932'で日本語が含まれていてもOK
df = pd.read_csv('フルパス', encoding='cp932')

CASE2:読み込むCSVに0から始まる値(郵便番号や電話番号など)が含まれる場合

郵便番号や電話番号が含まれたCSVをデフォルトのままデータフレームに取り込むと、先頭の0が抜けます。

0落ちを防ぎたい場合は、pd.read_csvの引数dtype='object'で、データフレームに数値ではなく文字列として取り込ませることで解決できます。

# dtype='object'で0落ちを防ぐ
df = pd.read_csv('フルパス', dtype='object')

CASE3:読み込むCSVにヘッダー(列見出し)やインデックス(行見出し)があるかどうか

通常では、1行目がヘッダーとして取り込まれますが、names=['a','b','c','d']のように任意の値を、列名として設定することもできます。リストまたはタプルで指定可能です。

# 新たにヘッダーを追加したい場合
df = pd.read_csv('フルパス', names=['a','b','c','d'])

インデックスは取り込むときに指定しない限り、勝手に0からの連番が振られます。

1列目をインデックスとして使用したいときは、index_col=0のように0始まりでインデックスを設定することもできます。

# 1列目をインデックスにしたい場合
df = pd.read_csv('フルパス', index_col=0)

CSVを書き出す

pandas-csv-readto2

df.to_csvでデータフレームをCSVファイルとして書き出します。

# CSVファイルを書き出す
df.to_csv('フルパス')

例えば、デスクトップに『new_sample.csv』として書き出したい場合、『'/Users/ユーザー名/Desktop/new_sample.csv'』とします。

to_csvの実践テクニック

CSVを書き出すときのポイント
  1. 書き出すCSVに日本語の値があるかどうか
  2. 書き出すCSVの1つ1つの値にダブルクオートさせるかどうか
  3. 書き出すCSVのインデックスを無視して出力したい

CASE1:書き出すCSVに日本語が含まれる場合

先程と同様に、文字化けしてしまうので、to_csvの引数encoding='cp932'で、日本語が扱える文字コードを設定します。

# 日本語が含まれるCSVを書き出す
df.to_csv('フルパス', encoding='cp932')

CASE2:書き出すCSVの値1つ1つを囲み文字(ダブルクオート)をつけるかどうか

CSVファイルには、値がダブルクォーテーションで囲まれているものとそうで無いものが存在します。

ダブルクォーテーションで囲まれていないCSV
1,2,3,4
11,12,13,14
101,102,103,104
ダブルクォーテーションで囲まれているCSV
"1","2","3","4"
"11","12","13","14"
"101","102","103","104"

場合によっては、ダブルクオートさせるかさせないか選びたいと思うので、その方法を紹介します。

補足
import csvで標準モジュールをインポートする必要があります。
to_csvの引数
  • quoting=csv.QUOTE_NONE:すべてをタブルクオートさせずに出力したい
  • quoting=csv.QUOTE_ALL:すべてをタブルクオートさせて出力したい
  • quoting=csv.QUOTE_NONNUMERIC:数値だけクオートせずに、それ以外をダブルクオートさせて出力したい
  • quoting=csv.QUOTE_MINIMAL:デリミタや引用符、改行コードのような特別な文字を含む値だけをクオートさせて出力したいデフォルト値

CASE3:書き出すCSVのインデックスを無視して出力したい

デフォルトでは、0から始まる連番がインデックスとしてデータフレームに与えられます。

だいたいの場合、この連番は不要なものだと思うので、to_csvの引数index=Falseで無効化させます。

# インデックスを無視してCSVを書き出す
df.to_csv('フルパス', index=False)

さいごに

今回は、Pandasを使ったCSVを読み込む・書き出す方法を紹介しました。

当記事の一連の流れを整理するプログラムです。

import pandas as pd
import csv

# フィールドに日本語が含まれるCSVファイルを全て文字列として読み込む
df = pd.read_csv('読み込みたいCSVがあるディレクトリ(フルパス)', encoding='cp932', dtype = 'object')

##########
# いろんな操作
##########

# 日本語が含まれ、インデックスを無効にし、全てのフィールドをダブルクオートさせてCSVを出力する
df.to_csv('出力先のディレクトリ(フルパス)', encoding='cp932', quoting=csv.QUOTE_ALL, index=False)

これだけでもだいぶ仕事を高速化できますが、スクレイピングや定時実行させることで、限りなく人間の作業時間を0に近づけることが出来ます。興味がある方はぜひチャレンジしてみて下さい!

【超便利】PythonとSeleniumでブラウザを自動操作する方法まとめ

2018.11.11

それでは\(^o^)/

SPONSORED LINK

pandas-csv-readto

ABOUTこの記事を書いてる人

たぬ

26歳。作業の90%をPythonにやらせているデータサイエンティスト兼ブロガー。 単純作業を自動化させ、クリエイターの生産性を上げるために当ブログを設立。毎月15万人に読まれています。 ストレングスファインダー:戦略性・最上志向・目標志向・未来志向・個別化