Pandas 0.16.2 で追加された pipe() の使い方
2015年7月23日に開催された 「Pythonエンジニア養成読本」読書会 03 – connpass で触れた話題ですが、Pandas 0.16.2 に、pipe()というメソッドが追加されています。
以下のデータ master.csv を扱います。
id | name | price |
---|---|---|
i100 | ham | 230 |
i200 | egg | 150 |
i300 | bacon | 170 |
簡単な使い方を解説します。
1 2 3 4 5 6 7 8 |
import pandas as pd master = pd.csv_read('master.csv') def f(df): return df master.pipe(f) |
pipe()の第1引数に関数名を指定します。この結果、master.csv と同じデータが返ります。関数f() はなにもせず、受け取ったDataFrameを返すだけの関数でした。
関数f() をもう少し複雑にします。
1 2 3 4 5 6 |
def f(df): df['tax_in'] = df['price'] * 1.08 return df master.pipe(f) |
この結果、次のデータが得られます。
id | name | price | tax_in |
---|---|---|---|
i100 | ham | 230 | 248.4 |
i200 | egg | 150 | 162.0 |
i300 | bacon | 170 | 183.6 |
pipe() は、DataFrameオブジェクトまたはSeriesオブジェクトに対して関数を適応できます。
引数も利用できます。
1 2 3 4 5 6 |
def f(df, col): df['tax_in'] = df[col] * 1.08 return df master.pipe(f, col='price') |
結果は「消費税の計算を行うpipe()の例」の実行結果と同等です。
ただし、これだけではpipe()のメリットは享受できていません。pipe()のメリットは、その名の通り、定義した関数を数珠つなぎに実行できる点にあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def discount(df): """ 商品名が ham だった場合に値引きを行います """ df2 = df.copy() df2.ix[df2.name == 'ham', 'price'] = df2.price - 30 return df2 def tax_in(df, col): """ 消費税を計算したカラムを追加します """ df['tax_in'] = df[col] * 1.08 return df (master.pipe(discount) .pipe(tax_in, col='price') ) |
この結果、次のデータが得られます。
id | name | price | tax_in |
---|---|---|---|
i100 | ham | 200 | 216.0 |
i200 | egg | 150 | 162.0 |
i300 | bacon | 170 | 183.6 |
これまでも、DataFrame(Series)に関数を適応する方法として、DataFrame.apply などが利用できました。
例に挙げたように、データの加工や計算を多段で行う場合にpipe()を利用すると、複雑なネストを防ぎ、データの変更を意識しやすいコードになります。
Social Links