4-4. pandas(DataFrame)-数値計算
df = pd.DataFrame([[1, 2, 3, 4], [10, 20, 30, 40], [51, 52, 53, 54]], columns=['v1', 'v2', 'v3', 'v4'])
単純四則計算
df + 1
==> v1 v2 v3 v4
==> 0 2 3 4 5
==> 1 11 21 31 41
==> 2 52 53 54 55
※ 全ての要素に1が加算される。
列同士の計算(v1+v2)
df['v1'] + df['v2']
==> 0 3
==> 1 30
==> 2 103
※ v1列とv2列の値が行ごとに加算された結果が戻される。
行同士の計算(1行目+2行目の全項目)
※列同士の計算のような単純式では記述できないので注意!転置して列同士の計算と同じ扱いにする。
df.T[0] + df.T[1]
==> v1 11
==> v2 22
==> v3 33
==> v4 44
==> dtype: int64
集計関数(sum, count, mean, describe 等)
df = pd.DataFrame([[1, 2, 3, 4], [10, 20, 30, 40], [51, 52, 53, 54]], columns=['v1', 'v2', 'v3', 'v4'])
sum(合計)
df.sum(axis=0)
==> v1 62
==> v2 74
==> v3 86
==> v4 98
==> dtype: int64
count(件数カウント)
df.count(axis=0)
==> v1 3
==> v2 3
==> v3 3
==> v4 3
==> dtype: int64
mean(平均)
df.mean(axis=0)
==> v1 20.666667
==> v2 24.666667
==> v3 28.666667
==> v4 32.666667
==> dtype: float64
max(最大)
df.max(axis=0)
==> v1 51
==> v2 52
==> v3 53
==> v4 54
==> dtype: int64
min(最小)
df.min(axis=0)
==> v1 1
==> v2 2
==> v3 3
==> v4 4
==> dtype: int64
統計量の出力
df.describe()
==> v1 v2 v3 v4
==> count 3.000000 3.000000 3.000000 3.000000
==> mean 20.666667 24.666667 28.666667 32.666667
==> std 26.652079 25.324560 25.026652 25.794056
==> min 1.000000 2.000000 3.000000 4.000000
==> 25% 5.500000 11.000000 16.500000 22.000000
==> 50% 10.000000 20.000000 30.000000 40.000000
==> 75% 30.500000 36.000000 41.500000 47.000000
==> max 51.000000 52.000000 53.000000 54.000000
列方向・行方向の集計計算(axis=0,1)
列ごと、行方向(axis=0)
df.sum(axis=0)
==> v1 62
==> v2 74
==> v3 86
==> v4 98
==> dtype: int64
※前述した、行同士の計算(1行目+2行目)は下記のようにも記述可能(あくまでも加算の場合)
df[0:2].sum(axis=0)
==> v1 11
==> v2 22
==> v3 33
==> v4 44
==> dtype: int64
行ごと、列方向(axis=1)
df.sum(axis=1)
==> 0 10
==> 1 100
==> 2 210
==> dtype: int64
行列計算
※機械学習では重要!
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['v1', 'v2'])
df2 = pd.DataFrame([[10, 0], [20, 40]], columns=['v1', 'v2'])
行列の加算
df1 + df2
==> v1 v2
==> 0 11 2
==> 1 23 44
行列の減算
df2 - df1
==> v1 v2
==> 0 9 -2
==> 1 17 36
行列の乗算
df1 * df2
==> >>> df1 * df2
==> v1 v2
==> 0 10 0
==> 1 60 160
※これは行列積ではなく、単なる各要素同士の掛け算であることに注意
[[1*10, 0*2]
[3*20, 4*40]]
行列積の計算
行列式としては、下記のように計算したい
[[1, 2] *[[10, 0]
[3, 4]] [20, 40]]
↓
[[1*10 + 2*20, 1*0 + 2*40]
[3*10 + 4*20, 4*0 + 4*40]]
↓
[[10+40, 0+80 ] =[[ 50, 80]
[30+80, 0+160]] [110,160]]
これを実現する方法は2つ。@演算子を使用するか、dot演算子を使用する。
@演算子を使用する行列積の計算
>>> df1 @ df2
==> ValueError: matrices are not aligned
>>> df1.values @ df2.values
array([[ 50, 80],
[110, 160]], dtype=int64)
dot演算子(numpy)を行う場合
df1.dot(df2)
==> ValueError: matrices are not aligned
※DataFrameのままだとエラーになる。
>>> np.dot(df1, df2)
array([[ 50, 80],
[110, 160]], dtype=int64)
>>> df1.values.dot(df2.values)
array([[ 50, 80],
[110, 160]], dtype=int64)
原則は@演算子を使用する
df3 = pd.DataFrame([10, 20], columns=['v1'])
df1 @ 5
===> IndexError: tuple index out of range
行列×スカラ値の場合、計算不能。
>>> np.dot(df1, 5)
==> array([[ 5, 10],
[15, 20]], dtype=int64)
※dot演算子の場合、計算できてしまう(成分ごとの積が求められる)。
求めたい値が行列積である場合は「@演算子」を使用する。