実務的なデータをさっと処理したい場合、
- SQL
- スクリプト言語
- Shell/AWK
- Excel
あたりがよく使われると思います。
ここでは、スクリプト言語の一つになると思いますが、Python+Pandas
紹介します。
Pandasは、Pythonのデータ処理用ライブラリで、DataFrameというExcelのスプレッドシートのようなオブジェクトを使って処理します。DataFrameはもともとS言語/Rに実装されていたものです。
Pandasの特徴である強力で豊富な統計処理の紹介が多いですが、実務データの処理もかなり使えます。
準備
ipython
pythonの対話実行環境としては、ipythonは必須です。 ファイルのタブ補完も効くのでサクサクできます。
pip install ipython
Pandasのimport
ここからは、事前にこのようにimportしていることを前提とします。
import pandas as pd
import numpy as np
データ読み取り
csvファイルの場合。
df = pd.read_csv("a.csv")
URLや桁区切りのカンマにも強いtsvファイルはこちら。
df = pd.read_csv("a.tsv", sep="\t")
ファイルにはヘッダを入れた方がいいです。
PandasのDataFrameはヘッダ情報もきちんと読み取り、列名称で値を指定することが可能なためです。
マージ(join)
現実の業務処理では、joinはかなり需要があると思います。
Pandasももちろんできますが、どちらかというと、統計処理で必要な行を追加していく(union系)の処理の紹介が多いと思います。
Pandasでのマージの仕方。
// キー名が違う場合
merged = pd.merge(df1, df2, left_on = 'id1', right_on = 'id2')
// キー名が同じ場合
merged = pd.merge(df1, df2, on = 'id')
mergeメソッドは、オプションも豊富です。
行ごとに処理
必要なデータが一つの表にまとまったら、行ごとに処理をしたいですね。
しかもこのロジックはかなり複雑になることがあります。
SQLで複雑なCASE文を書くよりもスクリプト言語で書いた方がすっきりする場合も多いです。
オススメはiterrows
を使うことです。apply
やmap
を使うと、関数を渡してシンプルに記述できるのですが、カラム名が使えなくなります。
df['new'] = ""
for key, record in df.iterrows():
if record["column1"] in ["a", "b"]:
...複雑なロジック
df.loc[key, 'new'] = "column1 is " + record["column1"]
また、ここはPandasの強力なスライシング処理によって、必要なデータを取得することが可能なのでロジックを簡潔にすることが可能です。
こちらはapplyを使って行ごとに処理する場合。
def f(s):
print s
df.apply(f, axis=1)
csv/tsvへの出力
非常にシンプルです
csv
df.to_csv("b.csv")
import csv
df.to_csv("b.csv", quoting=csv.QUOTE_ALL)
tsv
df.to_csv("b.csv", sep="\t")
まとめ
各ステップでは、そこに強い言語やツールがあるかと思います。
Python+Pandas
は一通り扱えることがメリットだと思います。
一旦、DataFrameに取り込んでしまえば、手続き的な処理、集計処理ともにかなり柔軟に処理ができます。
0 件のコメント:
コメントを投稿