一般的なPandasでのデータ操作方法
以前こんな記事を書きました
◆ Python Pandasでのデータ操作の初歩まとめ メソッド一覧表
http://qiita.com/hik0107/items/d991cc44c2d1778bb82e
Pandasでデータを操作する場合には上記のようなやり方が一般的なのですが、
ややコードが冗長になったり、可読性が低いと感じる時があります。
そんな方のために「pandas_ply」というパッケージを紹介します。
RのDplyrに似た記法でデータを扱えるため、Dplyrを使ったことがある人には特におススメです。
※ まさにPandas版のDplyrという感じです。
使ったことが無い方でも、ネイティブのPandasより使いやすいと思いますので、
是非試してみてください。
Pandas_plyを使いはじめる
◆pandas_plyパッケージ
https://pypi.python.org/pypi/pandas-ply
pandas_plyをインストールします
pip install pandas_ply
パッケージの準備
import pandas as pd
from pandas_ply import install_ply, X, sym_call
install_ply(pd)
pandasを呼び出し、そのあとにpandas_plyからinstall_plyをおこなうと、
pandas_plyのメソッドがpandasに付与される仕様になっています
これで準備完了です。
## 実際に使ってみる
詳しい使い方はこちら(英語)
http://pythonhosted.org/pandas-ply/
データはこちらを使ってみます。Kaggleで有名なデータですね。
titanic - train.csv
https://www.kaggle.com/c/titanic/data
csv_path = "/files_dir/train.csv" ##csvファイルの場所を指定
data = pd.read_csv(csv_path, delimiter=",")
##データを簡単に確認 : 新しいデータセットの場合は必須ですね
print data.head(10)
print data.shape
data.describe()
print data.columns
データの選択 ply_select
カラムへのアクセスは "column_name" もしくは X.column_nameで行うことが出来ます。
また、新しいカラムの作成(Dplyrでいうところのmutate的な使い方)
data.ply_select("Name", "Age",
gender = X.Sex, ## カラム名を変更できる
is_adult = (X.Age >= 20) ## 新しいカラムを定義することも可能になる
)
データの選択 ply_where
特定の条件を満たすデータだけをサブセッティングしたい時にはply_whereを使う
data.ply_where(X.Age>10,
X.Sex == "male",
X.Embarked == "S"
) #全ての条件にAndで満たすデータだけが選択される
これと同じことをPandasのネイティブな方法で書く場合には下記のようになります。
data.query(" Age>10 & Sex=='male' & Embarked == 'S' ")
##文字列が入り乱れてやや紛らわしい
data.ix[(data.Age>10) & (data.Sex =='male') & (data.Embarked=='S')]
##df名を何度も書く必要がある
個々の好みはあると思いますが、pandas_plyだと割りと可読性高くかけると思います。
フラグの追加 - この場合はapplyを使ったほうがいいかも
上記で新しいカラムの追加(ply_select)の方法を書きましたが、
新しいカラムを複雑な条件で生成したい場合などには、素直にPandasのapplyメソッドを使ったほうが
よいかもしれません。
例えば上記データで年齢と性別を使って新たな属性を "demographic"というカラムに追加したい場合は
下記のようにかけます。
新カラムの生成条件が関数として見やすく残るので安心
def add_demographic(data_input):
if data_input.Age >=20:
demo = "adut_m" if data_input.Sex == "male" else "adult_f"
else:
demo = "boy_and_girl"
return demo
data.ix[ : , "Demographic"] = data.apply(add_demographic, axis=1)
終わりに
pandas_plyはまだまだ開発途中のパッケージのようですので、ご利用は計画的に。
あまり情報が多くないパッケージですので、詳しい方いたら是非コメント下さい。