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関数の使い方についてまとめました。

合計値を使った計算処理をしたい場合には活躍する関数となるでしょう。

参考