[Python #16] pandasでcsvファイルを扱う

はじめまして。8月からPythonチームに参加しているH.Kです。東京都内の大学に通っている3年生で、専攻は情報系ではないのですが、実務的なプログラミングに興味があってインターンに参加しています。趣味は旅行と卓球とあとはリズムゲーム、いわゆる音ゲーなどです。

自己紹介はこのくらいにして、本題に移りましょう。今回はpandasというライブラリでcsvの読み込み・書き込みをする方法やデータの集計をする方法を解説したいと思います。

Pandasとは

pandasはデータの解析に用いられるPythonのライブラリの一種です。できることは主に

・csvやExcelファイルの読み込み、書き込み

・データの前処理

・データに対しての統計処理、回帰処理

といったものです。pandasのメリットは、複数の型が含まれたデータを一つのデータフレームで扱えることや、データの加工・解析機能が豊富なことなどです。Pythonチームでは主にWebスクレイピングを行っていますが、スクレイピングで得たデータは基本的にcsvファイルにまとめて提出するため、pandasをよく用いています。また、csvファイルから特定の条件を満たすデータの数を集計する、といった業務もあるのでそういった用途にも利用しています。

pandasのインストールとインポート

pandasは下記のコマンドでインストールすることができます。

pip install pandas

また、pandasを利用するには以下のようにpandasライブラリをインポートする必要があります。

import pandas as pd

これでpandasを使う準備は完了です。

csvファイルの読み込み・書き込み

csvファイルを扱うにあたり、まずはファイルを読み込む必要があります。ファイルの読み込みには、read_csv関数を使います。

file = sample.csv
df = pd.read_csv(file)
print(df)
#   a  b  c
#0  1  2  3
#1  4  5  6
#2  7  8  9

csvファイルを出力するには、to_csv関数を使います。2行目は、dataをpandasのデータフレームという型に変換し、またcolumnsで列名を指定しています。index=Falseは、設定しないと1列目にインデックスを勝手に書き出してしまうため設定しているものです。

data = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
df = pd.DataFrame(data, columns=["a", "b", "c"])
df.to_csv('sample1.csv',index=False)

データの合計の計算

合計を求めるにはsum関数を使います。例えばa列の数値の合計を求めるには下記のようにします。

print(df['a'].sum())
#12
print(df['b'].sum())
#15
print(df['c'].sum())
#18

まずdf['a']というのはdfのa列を指定しています。そしてsum関数でdf['a']の中の要素を合計しています。

特定の条件を満たす要素のカウント

さて、ここでもう少し複雑なデータを扱いましょう。これは2022年度のJ1リーグの結果です。今回はここから、特定の条件を満たすチームの数を集計したいと思います。

順位,クラブ名,勝点,勝,引分,敗,得点,失点,得失点差
1,横浜F・マリノス,68,20,8,6,70,35,35
2,川崎フロンターレ,66,20,6,8,65,42,23
3,サンフレッチェ広島,55,15,10,9,52,41,11
4,鹿島アントラーズ,52,13,13,8,47,42,5
5,セレッソ大阪,51,13,12,9,46,40,6
6,FC東京,49,14,7,13,46,43,3
7,柏レイソル,47,13,8,13,43,44,-1
8,名古屋グランパス,46,11,13,10,30,35,-5
9,浦和レッズ,45,10,15,9,48,39,9
10,北海道コンサドーレ札幌,45,11,12,11,45,55,-10
11,サガン鳥栖,42,9,15,10,45,44,1
12,湘南ベルマーレ,41,10,11,13,31,39,-8
13,ヴィッセル神戸,40,11,7,16,35,41,-6
14,アビスパ福岡,38,9,11,14,29,38,-9
15,ガンバ大阪,37,9,10,15,33,44,-11
16,京都サンガF.C.,36,8,12,14,30,38,-8
17,清水エスパルス,33,7,12,15,44,54,-10
18,ジュビロ磐田,30,6,12,16,32,57,-25

出典: 明治安田生命J1リーグ 順位表

df1 = pd.read_csv('result.csv')
plus = (df1['得失点差']>=0).sum() #得失点差が0以上のチームの数
print(plus)
#8
win = ((df1['勝'] > df1['敗'])&(df1['得失点差']>=0)).sum() #得失点差が0以上で、かつ勝利数が敗北数より多いチームの数
print(win)
#7

このように、条件式にsum関数を用いることで、特定の条件を満たすデータの数をカウントすることができます。このように小さいデータなら人力で集計するのは簡単ですが、データ数が3桁や4桁のサイズの大きいデータの場合それは大変です。しかし、このpandasのsumメソッドを用いることで簡単に、正確にデータを集計することができます。

おわりに

今回はpandasでcsvファイルを扱い、データの集計をする方法を解説しました。データ数の多いファイルを扱う際には、こうしたテクニックが非常に便利です。

このようにファイナルアンサーではデータの集計といった将来必ず社会で役に立つであろう業務も行っていますので、興味ある人はぜひエントリーしてください!

参考文献

pandasで特定の条件を満たす要素数をカウント(全体、行・列ごと)

pandasでcsv/tsvファイル読み込み(read_csv, read_table)