今回は、複数のpandasオブジェクト同士の算術における動作について学んでいく。
コンテンツ
シリーズの加算
まずは簡単な例として、シリーズを加算した例を見てみよう。
import pandas as pd
import numpy as np
series1 = pd.Series([-2.5, 5.3, -1.9, 3.2], index=['a', 'b', 'c', 'd'])
# a -2.5
# b 5.3
# c -1.9
# d 3.2
# dtype: float64
series2 = pd.Series([8.5, -1.2, -0.1, 4.5, 2.8], index=['b', 'a', 'c', 'e', 'f'])
# b 8.5
# a -1.2
# c -0.1
# e 4.5
# f 2.8
# dtype: float64
series1 + series2
# a -3.7
# b 13.8
# c -2.0
# d NaN
# e NaN
# f NaN
# dtype: float64
二つのオブジェクト(シリーズ)を加算すると、インデックスが重複したもの同士を足し合わせ、重複しないインデックスには欠損値が代入される。
データフレームの加算
データフレームの加算では次のとおり、計算は行列に対して行われる。
欠損値代入の動作はシリーズの場合と変わらない。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(15.).reshape(3, 5), index=['Tokyo', 'Osaka', 'Nagoya'], columns=list('abcde'))
df2 = pd.DataFrame(np.arange(20.).reshape(4, 5), index=['Osaka', 'Nagoya', 'Tokyo', 'Fukuoka'], columns=list('cdaef'))
df1 + df2
# a b c d e f
# Fukuoka NaN NaN NaN NaN NaN NaN
# Nagoya 17.0 NaN 17.0 19.0 22.0 NaN
# Osaka 7.0 NaN 7.0 9.0 12.0 NaN
# Tokyo 12.0 NaN 12.0 14.0 17.0 NaN
pandasオブジェクトの算術メソッド
一方にしかインデックスが無い場合、先述の例のとおり欠損値が代入されるが、任意の値による計算をおこないたい場合もあるだろう。
算術メソッドのaddを使えば、引数fill_valueに指定した値を使って計算をおこなうことができる。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(15.).reshape(3, 5), index=['Tokyo', 'Osaka', 'Nagoya'], columns=list('abcde'))
df2 = pd.DataFrame(np.arange(20.).reshape(4, 5), index=['Osaka', 'Nagoya', 'Tokyo', 'Fukuoka'], columns=list('cdaef'))
df1.add(df2, fill_value=0)
# a b c d e f
# Fukuoka 17.0 NaN 15.0 16.0 18.0 19.0
# Nagoya 17.0 11.0 17.0 19.0 22.0 9.0
# Osaka 7.0 6.0 7.0 9.0 12.0 4.0
# Tokyo 12.0 1.0 12.0 14.0 17.0 14.0
加算の他、減算などのその他算術メソッドも当然用意されているので、下記にまとめておく。
メソッド | 説明 |
add | 加算 (+) |
sub | 減算 (-) |
mul | 乗算 (*) |
div | 除算 (/) |
pow | 累乗 (**) |
データフレームとシリーズの演算
データフレームとシリーズのように、次元が違うオブジェクト同士の演算をおこなうことも可能だ。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(3, 5))
# 0 1 2 3 4
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
series = pd.Series(np.arange(5))
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# dtype: int64
df.sub(series)
# 0 1 2 3 4
# 0 0 0 0 0 0
# 1 5 5 5 5 5
# 2 10 10 10 10 10
これはデータフレームとシリーズを、subメソッドを使って減算した例だが、データフレームの各行に対してシリーズの値が減算されていることが分かる。
この各行へ対しておこなわれる処理をブロードキャストと言う。
ブロードキャストはデフォルトでは、シリーズのインデックスと、データフレームの列がマッチングされ演算が行われるが、データフレームの行(インデックス)にマッチングさせたい場合があるだろう。
その場合は、算術メソッドの引数axisでマッチさせたい軸を指定すれば良い。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(15).reshape(3, 5))
# 0 1 2 3 4
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
series = pd.Series(np.arange(5))
# 0 0
# 1 1
# 2 2
# 3 3
# 4 4
# dtype: int64
df.sub(series, axis=0)
# 0 1 2 3 4
# 0 0.0 1.0 2.0 3.0 4.0
# 1 4.0 5.0 6.0 7.0 8.0
# 2 8.0 9.0 10.0 11.0 12.0
# 3 NaN NaN NaN NaN NaN
# 4 NaN NaN NaN NaN NaN