search
LoginSignup
1

posted at

updated at

Pandas: データフレームについて--07: パイプ

パイプ

関数型言語では,データ処理のときに関数を入れ子にすることで中間結果(変数)を明示しないというやり方が,ある意味普通である。

1. 入れ子式に関数を呼ぶ場合

import pandas as pd
df = pd.DataFrame({
    'a': [1, 2, 3, 4, 5],
    'b': [1.2, 3.4, 5.6, 7.8, 9.0]
})
df

def func1(df):
  return df.transform('sqrt')

def func2(df, power=2, constant=1):
  return df.transform(lambda x: x**power + constant)
print(func2(func1(df)))
     a     b
0  2.0   2.2
1  3.0   4.4
2  4.0   6.6
3  5.0   8.8
4  6.0  10.0

2. パイプで順次関数を呼ぶ場合

これに対し,パイプは一つの関数の結果を次の関数の入力にするというように,あたかも「関数をパイプで繋ぐ」ように記述できるため,一部で人気(R など?)。Python でもできるが,効果の程は?

pipe(func: 'Callable[..., T] | tuple[Callable[..., T], str]', *args, **kwargs)
df.pipe(func1).pipe(func2, power=3, constant=5).pipe(print)
           a          b
0   6.000000   6.314534
1   7.828427  11.269290
2  10.196152  18.252019
3  13.000000  26.784214
4  16.180340  32.000000

以下のように書いたほうがわかりやすい場合もある。

(df.pipe(func1)
    .pipe(func2, power=3, constant=5)
    .pipe(print)
)
           a          b
0   6.000000   6.314534
1   7.828427  11.269290
2  10.196152  18.252019
3  13.000000  26.784214
4  16.180340  32.000000

3. もっと知りたい人

help(df.pipe) # Help on method pipe in module pandas.core.generic

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1