2016年8月20日土曜日

Pandasで実践的(というか実務的)なデータを扱う

実務的なデータをさっと処理したい場合、

  • 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を使うことです。applymapを使うと、関数を渡してシンプルに記述できるのですが、カラム名が使えなくなります。

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 件のコメント:

コメントを投稿