Pythonでcsvファイルのデータを辞書データとして集計する簡単なプログラム


slip-lines

photo credit: Leonegraph Shoes and stripes via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者&Windowsユーザー向け、Pythonで辞書を使った集計ツールの作り方をお伝えしています。

前回の記事はこちら。

Pythonで辞書にキーが存在していなければキーと値を新たに追加する方法
初心者&Windowsユーザー向けに、Pythonで辞書を使った集計ツールの作り方です。辞書に指定したキーが存在するかどうかを判定して、存在しなければ辞書のキーとして追加をするという処理を追加します。

辞書に特定のキーがあるかどうかについて判定する方法をお伝えしました。

さて、これまでは集計する元のデータはリストとして用意していましたが、最初っからリストになっていてくれることはほとんどありません。

実際には、別の形式で与えられる場合が多いのですが、よくあるパターンは、そう。csvファイルですよね。

ということで、今回はcsvファイルのデータを辞書として集計する方法をお伝えします。

では、いってみましょう。

スポンサーリンク

前回のおさらい

まずはおさらいから。

前回作成したスクリプトはこちらでした。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {}
for onigiri in onigiris:
    count.setdefault(onigiri, 0)
    count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))

リストとしてまとめられているおにぎりの種類について、その登場回数を辞書として集計するというものでした。

3行目のfor文でリストのデータ全てについてループをします。

そして、ポイントは4行目。setdefaultメソッドで、辞書countにないキーが出てきたら、新たにそのキーを追加しその値を0とするという部分です。

結果として、以下のような出力が得られます。

Pythonでリストの集計をした結果

csvファイルのデータを集計する

今回は与えるデータを、リストではなく、以下のようなcsvファイルとしたいと思います。

Pythonで集計対象にするcsvファイル

1列目におにぎりの具の種類、2列目に料金が入力されている「onigiris.csv」というファイル名のcsvファイルです。

まず、これまでと同様に、おにぎりの具の種類について登場した回数をカウントするスクリプトを作っていきましょう。

csvファイルのデータを読み取る

csvファイルを開いてデータを読み取る方法は、以下の記事で紹介しています。

Pythonでcsvファイルからデータを読み込む最初の一歩
初心者向けにPythonの基本中の基本をフォルダ作成ツールを作りながら学ぶシリーズです。今回はPythonでcsvファイルをデータを読み込む最初の一歩についてお伝えします。Readerオブジェクトについても触れますよ。

ポイントは以下です。

まず、ファイルを開くにはopen関数を使います。今回は、読み取りで開きますのでmodeは省略して読み取りモードとします。

with open(file, mode) as csvファイル:
  # 処理

次に、csvファイルのデータをPythonで扱う形式であるReaderオブジェクトとして取得します。csvモジュールのreader関数を使いますね。

Readerオブジェクト = csv.reader(csvファイル)

このReaderオブジェクトが取得できれば、以下の書式で行単位でループを回すことができます。

for 行のリスト in Readerオブジェクト:
  # 処理

これで、各行をリストとして取得できるので、必要な列の値をインデックスを指定して取り出せばOKです。

csvファイルのデータを集計するスクリプト

以上を踏まえて、以下のようなスクリプトを作成しました。

import csv
count = {}
with open('onigiris.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        onigiri = row[0]
        count.setdefault(onigiri, 0)
        count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))     

では、実行してみましょう。

Pythonでcsv集計をして見出し行も対象になってしまった

おや…具の種類?

csvファイルの1行目、見出し行のデータもカウント対象になってしまいました。

見出し行は飛ばしたいですね…。

next関数でcsvの見出し行を飛ばす

はい、Pythonにはそのままズバリ行を飛ばすメソッドが存在しています。next関数です。

next関数を使うと、Readerオブジェクトの読み取る行を現在の次の行に移します。

書き方はこちら。

next(Readerオブジェクト)

ちなみに、戻り値として飛ばした行のリストを取得します。

見出し行を飛ばしてcsvファイルのデータを集計する

next関数を使って先ほどのスクリプトを修正しました。

こちらです。

import csv
count = {}
with open('onigiris.csv') as f:
    reader = csv.reader(f)
    header = next(reader)
    print(header)
    for row in reader:
        onigiri = row[0]
        count.setdefault(onigiri, 0)
        count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))  

5行目にnext関数を1回入れていますので、見出し行を飛ばして集計をすることができます。

また、ついでに6行目でnext関数で取得した見出し行のリストを表示しています。

実行結果は…

Pythonで見出し行を飛ばしてcsvの集計をする

となります。

まとめ

Pythonでcsvファイルのデータを辞書データとして集計する方法をお伝えしました。

  • csvファイルのデータを取得する
  • next関数で行を飛ばす

Pythonはデータ分析に強いそうですから、その初歩の初歩のテクニック…ということになるのではないかと期待しています。

今回はいわゆる「COUNTIF」のような処理でしたが、次回はcsvファイルから「SUMIF」をしたいと思います。

どうぞお楽しみに!

連載目次:初心者向けPythonで辞書を使った集計ツールの作り方

Pythonの「辞書」を使うことで、カウントや計算などの集計作業を簡単に行うことができます。本シリーズでは、辞書とは何かというところから実際にcsvファイルを集計するツールを作るところまでを伝えしていきます。

  1. Pythonでリストの値をカウントをする超簡単なプログラム~辞書とは何か、またその使い方
  2. Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方
  3. Pythonで辞書にキーが存在していなければキーと値を新たに追加する方法
  4. Pythonでcsvファイルのデータを辞書データとして集計する簡単なプログラム

タイトルとURLをコピーしました