PandasでCSVファイルを読み書き
はじめまして!DATUMSTUDIOのゴトウです!
台風13号が首都圏に接近中ですね。通勤通学時等くれぐれもお気をつけください。
前置き
データ分析を行う際に、CSV形式のデータを扱う事が多いと思います。
以下の場合における、ちょっとしたテクニックをご紹介します。
- CSV形式のファイルをPython(3系)で読み込む
- Python内で生成されたデータフレームをCSV形式ファイルとして出力する
本記事では、以下のデータを持つCSVファイルを例として進めます。
A | B | C |
---|---|---|
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
通常の読み込みと出力
とくに処理を加えなければ、以下のコードになります。
# pandasの読み込み import pandas as pd # CSVの読み込み df = pd.read_csv('sample.csv') # CSVとして出力 df.to_csv('output.csv')今回はシンプルなデータを読み込んでいるので、特段、処理を加える必要はありませんが、
実際のデータは、
- カラム数が非常に多い
- データが大きく、行数が非常に多い
- 格納されているデータの型が意図したものと異なる
という課題があるかと思います。
なにも考えず読み込みをすると、余計に時間がかかってしまったり、読み込んだ後に追加の加工が必要になったりします。
このとき、以下に挙げるような工夫を加えることで、
後の処理を楽になることがあります。
①読み込み時の工夫
ヘッダーの有無
通常CSVを読み込む際には、1行目をヘッダーとして認識します。
例えば、下記のようなヘッダーのないCSVがあるとします。
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
これを通常通り読み込んでしまうと、先頭行をヘッダーと認識してしまいます。
犬 | 哺乳類 | 1 |
---|---|---|
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
ヘッダーとして認識してしまいました。
この対処法として以下のようにして読み込んでみてください。
df = pd.read_csv('sample.csv', header=None)
読み込んだデータフレームの中身を確認すると。。。
1 | 2 | 3 |
---|---|---|
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
先頭行をヘッダーとして認識せずに読み込む事に成功しました!
encoding
CSV読み込み時に文字コードを指定してあげることができます。
日本語などが含まれるデータを扱う際には、文字コードを指定して読み込んであげる必要があります。
df = pd.read_csv('sample.csv', encoding='utf-8')
utf-8以外にもshift-jisなども設定が出来ます。
型を指定
CSV読み込み時に、データの型を指定することが出来ます。
例えば、C列は数値が入っておりましたが、これを文字列として読み込みたい時は、
df = pd.read_csv('sample.csv', dtype = {'C':'object'})
このようにdtypeと追記して、型を指定したい列(C列)と型(object)を記載します。
また、全て文字列で読み込みたいといった場合は、
df = pd.read_csv('sample.csv', dtype='object')
このように記載することで全て文字列として読み込むことが可能です。
nrows
データボリュームが非常に大きい時、最初から全てを読み込まずに100行だけ読み込み、
処理のテストを行いたいこともあります。
例えば、先頭から2行だけ読み込む場合、
df = pd.read_csv('sample.csv', nrows=2)
読み込み時にカラムを指定
CSVを読み込む際に、一部のみを利用する場合、
全て読み込まずカラムを絞って読み込むことも可能です。
例えば、A列とC列のみ読み込みたい場合は、
df = pd.read_csv('sample.csv', usecols=['A', 'C'])
A | C |
---|---|
犬 | 1 |
アヒル | 2 |
カクレクマノミ | 3 |
ウミガメ | 4 |
A列とC列のみ読み込むことができました!
②出力時の工夫
圧縮形式を決めて出力(bz2など)
何も指定しないと圧縮しないままCSVに出力されます。
データが大きい際には、圧縮形式を指定し出力することが可能です。
df.to_csv('output.csv.bz2', compression='bz2')
mode=a 追記する
仮に同じ名前のCSVをto_csvで生成する際にはデータが上書きされてしまいますが、
上書きせずに追記したいときにも一工夫してあげることで、既存データに追記が可能です。
# 追記する際に、ヘッダーが含まれないようにheader=Noneとする df.to_csv('output.csv', mode='a', header=None)
元のCSV
A | B | C |
---|---|---|
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
A | B | C |
---|---|---|
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
※header=Noneとせずに、追記してしまった場合、
以下のようにヘッダーが複数行含まれたデータになってしまします。
A | B | C |
---|---|---|
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
A | B | C |
犬 | 哺乳類 | 1 |
アヒル | 鳥類 | 2 |
カクレクマノミ | 魚類 | 3 |
ウミガメ | 爬虫類 | 4 |
列を指定して出力
扱ったデータフレームの、一部のみを出力したい場合、
カラムを指定してCSVに出力することが可能です。
# AとBのみを出力する df.to_csv('output.csv', columns=['A', 'B'])
A | C |
---|---|
犬 | 1 |
アヒル | 2 |
カクレクマノミ | 3 |
ウミガメ | 4 |
まとめ
以上がPythonを使ってCSVを読み込み・出力の際のTipsとなります。
今回ご紹介した方法以外にもまだまだ出来ることはたくさんありますので
是非公式ページなどから情報を収集してみてください。
リンク
DATUM STUDIOでは様々なAI/機械学習のプロジェクトを行っております。
詳細につきましてはこちら
詳細/サービスについてのお問い合わせはこちら
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事