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