PandasにはNumPyと同様に合計を求める関数が存在します。
今回はPandasのsum
関数の使い方について解説します。
sum関数
まずは合計を求めるsum
関数からみていきます。
APIドキュメント
pandas.DataFrame.sum(axis=None,skipna=None,level=None,numeric_only=None,min_count=0, **kwargs)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
axis | ‘index’,0 または ‘columns’,1 |
(省略可能)初期値None 縦か横、どちらの方向に要素を足し合わせていくかを指定します。 |
skipna | bool値 | (省略可能)初期値True 合計を計算する際、欠損値を無視するかどうかを指定します。無視しない場合、NaN値が含まれているとエラーが返ります。 |
level | intもしくは階層名 | (省略可能)初期値None 指定した軸(axis)のラベルがMultiIndexだった場合、どの階層に沿って合計を求めるか指定します。 |
numeric_only | bool値 | (省略可能)初期値None Trueにするとデータ型がfloat,int,boolのカラムのみで合計を計算します。Falseの場合、全ての型で計算できないか試みます。 |
min_count | int | (省略可能)初期値0 合計を計算するのに必要なデータ数を指定します。これに満たなかった場合、結果はNAになります。 |
returns:
合計値をデータとするSeries(levelが指定されている場合はDataFrame)が返されます。
min_count
引数はあまり馴染みのない引数ですが、合計値を計算する上で有効なデータ数くらいの認識で問題ありません。
それでは実際に使ってみましょう。
列ごとに合計を計算する
DataFrameやSeriesにそのままsum
関数を適用させると、DataFrameであれば列ごとに、Seriesはデータ全体が対象となって合計が算出されます。
In [1]: import pandas as pd
In [3]: df = pd.DataFrame({'A':[0,1,2,3,4,5],'B':[0,1,2,None,4,5],
...: 'C':['a','b','c','d','e','f']})
...:
In [4]: df
Out[4]:
A B C
0 0 0.0 a
1 1 1.0 b
2 2 2.0 c
3 3 NaN d
4 4 4.0 e
5 5 5.0 f
In [5]: df.sum()
Out[5]:
A 15
B 12
C abcdef
dtype: object
In [6]: df['A'].sum() # Seriesならデータ全体
Out[6]: 15
行ごとの合計を計算する
axis=1
またはaxis='columns'
とすれば行ごとの合計を算出します。
文字データと数値データが混在しているときは数値データが優先され、文字データは無視されます。
In [8]: df.sum(axis=1) # 行ごとの合計を算出(文字データはむし)
Out[8]:
0 0.0
1 2.0
2 4.0
3 3.0
4 8.0
5 10.0
dtype: float64
NaN値を無視しない
NaN値を無視しないで計算します。 この場合、欠損値(NaN値)が1つでも含まれていると結果はNaNになります。
In [9]: df.sum(skipna=False)
Out[9]:
A 15
B NaN
C abcdef
dtype: object
合計値を算出するための必要最低限個数を指定する
min_count
の値を指定すると、合計値を計算するために必要な値の個数を指定します。
min_count=3
にすると、例えば2個しか値がなかった場合、そこの合計値は無効となり、NaN値が返されます。
In [10]: df_nan = df.copy() # データの複製
In [11]: df_nan.iloc[:3,0] = None # NaN値となる箇所を増やす
In [12]: df_nan
Out[12]:
A B C
0 NaN 0.0 a
1 NaN 1.0 b
2 NaN 2.0 c
3 3.0 NaN d
4 4.0 4.0 e
5 5.0 5.0 f
In [13]: df_nan.sum(min_count=4) # 4つ以上データがないと合計が算出されない
Out[13]:
A None
B 12
C abcdef
dtype: object
In [14]: df_nan.sum(min_count=3) # 3つ以上データがないと合計が算出されない
Out[14]:
A 12
B 12
C abcdef
dtype: object
数値データのみで計算する
先ほどまでの例のように、numeric_only
引数に何も指定しないと数値データだけでなく文字データも足し合わされた結果が出力されています。
こういうものを避けたい場合はnumeric_only=True
にすることで、文字列データの含まれている列データは結果に表示されないようにすることができます。
In [15]: df
Out[15]:
A B C
0 0 0.0 a
1 1 1.0 b
2 2 2.0 c
3 3 NaN d
4 4 4.0 e
5 5 5.0 f
In [16]: df.sum()
Out[16]:
A 15
B 12
C abcdef
dtype: object
In [17]: df.sum(numeric_only=True) # 数値データのみで演算
Out[17]:
A 15.0
B 12.0
dtype: float64
MultiIndexの特定の階層のラベルごとにまとめる
MultiIndexを持っているデータで合計を取るとき、level
引数を指定することで指定したラベルごとの合計値を求めることができます。
In [18]: import numpy as np
In [19]: data = np.random.randint(10,size=(5,5)) # 乱数の生成
In [26]: df_multi = pd.DataFrame(data, index=[['A','A','A','B','B'],['a','b','a','b','a']])
In [27]: df_multi
Out[27]:
0 1 2 3 4
A a 5 8 3 0 0
b 2 1 6 5 4
a 2 6 6 0 1
B b 4 0 2 9 9
a 1 4 6 5 0
In [28]: df_multi.sum()
Out[28]:
0 14
1 19
2 23
3 19
4 14
dtype: int64
In [30]: df_multi.sum(level=0) # 一番外側のラベル('A','B')ごとに合計値を算出
Out[30]:
0 1 2 3 4
A 9 15 15 5 5
B 5 4 8 14 9
In [31]: df_multi.sum(level=1) # 一つ内側のラベル('a','b')ごとに合計値を算出
Out[31]:
0 1 2 3 4
a 8 18 15 5 1
b 6 1 8 14 13
まとめ
今回は合計を求めるsum
関数の使い方についてまとめました。
合計値を使った計算処理をしたい場合には活躍する関数となるでしょう。