このエントリーをはてなブックマークに追加

Advent Calendar 2013 - 18

Python で解析! - DataFrame 13

今回は apply を取り上げる。DataFrame に任意の関数を実行するもので、 python の組み込み関数である map と思えばいいだろう。

1. データの準備

では、いつもの通りのデータの準備を。

import pandas as pd

df = pd.DataFrame({
   'height': [162, 178, 167, 171, 170],
   'weight1': [51, 80, 55, 68, 71],
   'weight2': [53, 75, 51, 68, 73]
})
   height  weight1  weight2
0     162       51       53
1     178       80       75
2     167       55       51
3     171       68       68
4     170       71       73

2. DataFrame に apply を適用

例えば偶数の判定は次のように書ける。

df.apply(lambda x: x % 2 == 0)
  height weight1 weight2
0   True   False   False
1   True    True   False
2  False   False   False
3  False    True    True
4   True   False   False

ただ、この程度だと式で書けてしまう…。

df % 2 == 0
  height weight1 weight2
0   True   False   False
1   True    True   False
2  False   False   False
3  False    True    True
4   True   False   False

3. Series に apply を適用

いつものごとく、特定の列にだけ apply を適用することもできる。

df.height.apply(lambda x: x % 2 == 0)

いい例を思いつかないので、 FizzBuzz をやってみた。

def fizzbuzz(x):
   def fizz(x):
      return 'Fizz' if x % 3 == 0 else ''
   def buzz(x):
      return 'Buzz' if x % 5 == 0 else ''
   val = fizz(x) + buzz(x)
   return val if len(val) > 0 else x

df.height.apply(fizzbuzz)
0    Fizz
1     178
2     167
3    Fizz
4    Buzz
Name: height, dtype: object

せっかくなので、DataFrame にも FizzBuzz を適用してみるが、DataFrame の場合は引数に Series が渡されるので、その対応をする必要がある。

def fizzbuzz(x):
   def fizz(x):
      return 'Fizz' if x % 3 == 0 else ''
   def buzz(x):
      return 'Buzz' if x % 5 == 0 else ''
   def temp(x):
      val = fizz(x) + buzz(x)
      return val if len(val) > 0 else x
   return [it for it in x.apply(temp)]

df.apply(fizzbuzz)
  height weight1   weight2
0   Fizz    Fizz        53
1    178    Buzz  FizzBuzz
2    167    Buzz      Fizz
3   Fizz      68        68
4   Buzz      71        73

今回はこんなところで。