Python – 4-4. pandas(DataFrame)計算

4. 数値計算

1. 一般的な計算

データの準備

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

2. 集計関数(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

3. 行列計算

※機械学習では重要!

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演算子の場合、計算できてしまう(成分ごとの積が求められる)。
 求めたい値が行列積である場合は「@演算子」を使用する。

2022-04-12

Posted by tfurukaw