Python3 pandasでcsvファイルを読み込む

量の多いデータを気軽に扱うには表計算ソフトは便利ですが、 それをプログラムで処理する時に表計算ソフトの関数やマクロを使うと管理が面倒だと感じることがあります。 ここでは、データを表計算ソフトで入力し、csvでエクスポートをしたのち、pythonでそれを読み込み処理することを考えます。

以下の例では、ある抽選システムでの応募者のIDidと応募人数numの二つの列を持つデータを用意し、 全ての応募の表示と応募人数の合計を求めることを行います。

表計算ソフトでの入力例

id num
1 1
2 1
3 1
4 1
5 2
6 2
7 2
8 3
9 3
10 4

注意点

  • 一行目に列の名前を入力するとpythonのpandasで処理する際に便利になる
  • ここでは空の列や行を意図的に入れています。 もちろん空の列や行は無いに越したことはありませんが、表計算ソフトで入力している最中に一時的に利用することがあったり、 csvにエクスポートする前に消したと思っても残っている場合があるため、 空の行や列の削除はpython側で行うようにします。

エクスポートされたcsvの例(sample.csv)

id,num,,
1,1,,
2,1,,
3,1,,
4,1,,
5,2,,
6,2,,
7,2,,
8,3,,
9,3,,
10,4,,
,,,
,,,
,,,

pythonでのプログラムの例(readcsv.py)

import sys
import pandas as pd

if (len(sys.argv) != 2):
    print('Usage: # python {} filename.csv'.format(sys.argv[0]))
    quit()

filename = sys.argv[1]
df = pd.read_csv(filename)

# pandasのオブジェクトを直接扱うのは若干面倒なので(高機能だけど),
# 通常のpythonの配列や辞書にしてから扱う
applications = []

# .dropna(subset=['id']) でcsvのid列が空のものを除外する
for index, row in df.dropna(subset=['id']).iterrows():
    applications.append({
        'id': int(row['id']),
        'num': int(row['num'])
    })


# csvの全列挙
for row in applications:
    print('id: {}, num: {}'.format(row['id'], row['num']))

# num列の合計
num_sum = 0
for row in applications:
    num_sum += row['num']
print('sum : {}'.format(num_sum))

terminal output

$ python readcsv.py sample.csv
id: 1, num: 1
id: 2, num: 1
id: 3, num: 1
id: 4, num: 1
id: 5, num: 2
id: 6, num: 2
id: 7, num: 2
id: 8, num: 3
id: 9, num: 3
id: 10, num: 4
sum : 20