Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでCSVファイルを操作する方法|csvモジュールとpandasによる読み書きの基本


CSVファイル(Comma Separated Values:カンマ区切り値)は、プラットフォームを問わずデータを保存・共有できる、最も広く使われているフラットファイル形式のひとつです。各列はカンマで区切られ、任意でヘッダー行を設けて各列の名前を示すこともできます。PythonにはCSVファイルを扱うためのモジュールが複数用意されており、本記事では標準ライブラリのcsvモジュールと、データ分析で定番のpandasを使って、CSVファイルの読み込みと書き込みを行う方法を解説します。

csvモジュールを使ったCSVファイルの読み込み

まずは標準ライブラリのcsvモジュールを使った基本的な読み込み方法です。サンプルとして、アヤメ(iris)の計測データが格納されたCSVファイルを使用します。このようなデータセットは、学習用に公開されているものを利用できます。

コード例

import csv
with open('C:\\iris.csv','rt')as file:
    csv_rows = csv.reader(file)
    for row in csv_rows:
        print(row)

実行結果

上記のコードを実行すると、以下のような出力が得られます。

['sepal.length', 'sepal.width', 'petal.length', 'petal.width', 'variety']
['5.1', '3.5', '1.4', '.2', 'Setosa']
['4.9', '3', '1.4', '.2', 'Setosa']
['4.7', '3.2', '1.3', '.2', 'Setosa']
['4.6', '3.1', '1.5', '.2', 'Setosa']
['5', '3.6', '1.4', '.2', 'Setosa']
['5.4', '3.9', '1.7', '.4', 'Setosa']
['4.6', '3.4', '1.4', '.3', 'Setosa']
………………
………………

csv.reader()はファイルの各行をリストとして返すため、forループで1行ずつ処理できます。すべての値が文字列として読み込まれる点に注意してください。

pandasを使ったCSVファイルの読み込み

pandasライブラリでもCSVファイルを読み込めます。read_csv()メソッドにパスとファイル名を渡すだけで直接読み込むことができ、読み込んだデータはDataFrame(データフレーム)として扱えます。これにより、データセット全体や一部の行だけを柔軟に表示・加工できます。

コード例

import pandas as pd
datainput = pd.read_csv('C:\\iris.csv')
print("Given dataset values : \n", datainput)
# データセットのサイズを表示
print("\nThe size of the dataset is :\n",datainput.shape)
# 先頭数行だけ表示
print("\n printing few rows from the dataset :\n",datainput[0:6])

実行結果

上記のコードを実行すると、以下のような出力が得られます。

Given dataset values :
    sepal.length    sepal.width    petal.length    petal.width    variety
0           5.1            3.5             1.4            0.2     Setosa
1           4.9            3.0             1.4            0.2     Setosa
2           4.7            3.2             1.3            0.2     Setosa
3           4.6            3.1             1.5            0.2     Setosa
4           5.0            3.6             1.4            0.2     Setosa
..          ...            ...             ...            ...        ...
145         6.7            3.0             5.2            2.3  Virginica
146         6.3            2.5             5.0            1.9  Virginica
147         6.5            3.0             5.2            2.0  Virginica
148         6.2            3.4             5.4            2.3  Virginica
149         5.9            3.0             5.1            1.8  Virginica
[150 rows x 5 columns]
The size of the dataset is :
(150, 5)
printing few rows from the dataset :
      sepal.length      sepal.width    petal.length    petal.width    variety
0             5.1              3.5             1.4            0.2     Setosa
1             4.9              3.0             1.4            0.2     Setosa
2             4.7              3.2             1.3            0.2     Setosa
3             4.6              3.1             1.5            0.2     Setosa
4             5.0              3.6             1.4            0.2     Setosa
5             5.4              3.9             1.7            0.4     Setosa

shape属性でデータセットのサイズ(行数×列数)を確認でき、スライス[0:6]を使えば先頭の任意の行だけを抽出して表示できます。大規模なデータを扱う場合は、pandasの方が効率的で便利です。

csvモジュールを使ったCSVファイルの書き込み

CSVファイルを作成する場合も、Pythonのリストを活用します。各行をリストとして定義し、それらすべての行を大きなリスト(リストのリスト)にまとめます。ヘッダー行も別のリストとして用意しておきましょう。あとはwriterow()writerows()といったメソッドとcsv.writerを使えば、ローカルシステム上にCSVファイルとして書き出せます。

コード例

import csv
data = ["Month", "1958", "1959", "1960"]
x = [
["JAN", 340, 360, 417],
["FEB", 318, 342, 391],
["MAR", 362, 406, 419],
["APR", 348, 396, 461],
["MAY", 363, 420, 472],
["JUN", 435, 472, 535],
["JUL", 491, 548, 622],
["AUG", 505, 559, 606],
["SEP", 404, 463, 508],
["OCT", 359, 407, 461],
["NOV", 310, 362, 390],
["DEC", 337, 405, 432],
]
y = "C:\\years.csv"
with open(y, 'w') as work:
    z = csv.writer(work)
    z.writerow(data)
    z.writerows(x)

実行結果

上記のコードを実行すると、指定したパスに以下の内容のCSVファイルが生成されます。

Month,1958,1959,1960
JAN,340,360,417
FEB,318,342,391
MAR,362,406,419
APR,348,396,461
MAY,363,420,472
JUN,435,472,535
JUL,491,548,622
AUG,505,559,606
SEP,404,463,508
OCT,359,407,461
NOV,310,362,390
DEC,337,405,432

writerow()は1行ずつ書き込むメソッド、writerows()は複数行をまとめて書き込むメソッドです。用途に応じて使い分けるとよいでしょう。

pandasを使ったCSVファイルの書き込み

pandasを使う場合は、まず行データとヘッダー(列名)を含むDataFrameを作成します。その後、to_csv()メソッドにファイル名と保存先のパスを引数として渡せば、データをCSVファイルに出力できます。インデックス列を出力したくない場合はindex=Noneを指定します。

コード例

from pandas import DataFrame
C = {'Month': ['JAN','FEB', 'MAR'],
    '1958': ['345', '435', '545'],
    '1959': ['377', '135', '985'],
    '1960': ['498', '354', '765'],
}
df = DataFrame(C, columns= ["Month", "1958", "1959", "1960"])
export_csv = df.to_csv (r'C:\\years_p.csv', index = None, header=True) # 結果ファイルの保存先パスを指定
print (df)

実行結果

上記のコードを実行すると、以下の出力が得られ、同時にCSVファイルが保存されます。

  Month 1958 1959 1960
0  JAN   345  377  498
1  FEB   435  135  354
2  MAR   545  985  765

まとめ

PythonでCSVファイルを操作する方法として、標準ライブラリのcsvモジュールとpandasの2つのアプローチを紹介しました。シンプルな読み書きならcsvモジュールで十分ですが、データの集計・加工・分析まで行いたい場合はpandasが圧倒的に便利です。用途に合わせて使い分けることで、データ処理の効率を大きく向上させられます。

  1. PythonでPDFを操作しよう!PyPDF2ライブラリの使い方を徹底解説

    Pythonは多彩なライブラリを備えた非常に汎用性の高いプログラミング言語です。日常業務でよく扱うPDF(Portable Document Format)ファイルについても、Pythonにはさまざまな操作手段が用意されています。本記事では、その中でも「PyPDF2」というライブラリを使ってPDFファイルを操作する方法を解説します。 PyPDF2は純粋なPythonで実装されたPDFライブラリで、PDFページの分割・結合・切り抜き・変換が可能です。さらに、カスタムデータや表示オプション、パスワードの追加、テキストやメタデータの取得、ファイル全体のマージといった機能も備えています。 PyPDF

  2. 【Python入門】メタクラスによるメタプログラミングの基本と実践例

    メタプログラミングとは、プログラムが自分自身を操作したり、自身についての知識を持ったりするプログラミング手法のことを指します。Pythonでは「メタクラス」と呼ばれる特殊なクラスを使うことで、クラスに対するメタプログラミングを実現できます。メタクラスによるメタプログラミングでは、既存のコードを修正・ラップ・生成することでコードを操作する関数やクラスを構築します。メタプログラミングの主な機能は以下の通りです。メタクラスデコレータクラスデコレータメタクラスとは何かメタクラスを簡潔に定義するなら、「クラスを作り出すクラス」です。Pythonはオブジェクト指向言語であり、すべてがオブジェクトとして扱わ