PandasにはNumPyと同様に平均を求める関数が存在します。

今回はPandasで平均を求めるmean関数の使い方について解説します。

mean関数

mean関数は平均を求めてくれる関数です。

APIドキュメント

mean関数のAPIドキュメントは以下の通りです。

pandas.DataFrame.mean(axis=None,skipna=None,level=None,numeric_only=None, **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の場合、全ての型で計算できないか試みます。

returns:

平均値をデータとするSeries(levelが指定されている場合はDataFrame)が返されます。

引数自体はシンプルなので、Pandasにある程度慣れている方なら名称だけで意味がわかるものも多いのではないでしょうか。

では使い方をみていきましょう。

列ごとの平均を求める

特に引数を指定しない場合は列ごとの平均を求めてくれます。また、文字列データは無視されます。

In [32]: df
Out[32]:
   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 [33]: df.mean()
Out[33]:
A    2.5
B    2.4
dtype: float64

行ごとの平均を求める

行ごとの平均を求めるにはaxis=1またはaxis='columns'と指定します。

In [34]: df.mean(axis='columns') # 行ごとの平均を求める
Out[34]:
0    0.0
1    1.0
2    2.0
3    3.0
4    4.0
5    5.0
dtype: float64

NaN値を無視しない

skipna=FalseにするとNaN値が1つでも含まれているデータの平均値はNaNとなります。

In [35]: df.mean(skipna=False) # NaN値が1つでもあれば平均値は計算されない
Out[35]:
A    2.5
B    NaN
dtype: float64

数値データのみで平均値を求める

sum関数とは違い、デフォルトの状態で文字列データが足し合わされることはないですが、'1', '2'といった文字列データだが並びが数値になっているものが無い限り、numeric_only=Trueにしておくとデータ型を数値のものに限って平均を計算してくれるので意図しない計算結果を出すケースを減らすことができます。

In [36]: df['D'] = ['1','2','3','4','5','6']

In [37]: df
Out[37]:
   A    B  C  D
0  0  0.0  a  1
1  1  1.0  b  2
2  2  2.0  c  3
3  3  NaN  d  4
4  4  4.0  e  5
5  5  5.0  f  6

In [38]: df.mean()
Out[38]:
A        2.5
B        2.4
D    20576.0
dtype: float64

列’D’については123456を6で割った値になっています。これは、文字列の結合を行った後に、データ数で割るという処理を行っているためです。 こういった結果が必要ない場合、numeric_only=Trueとすると解決します。

In [39]: df.mean(numeric_only=True)
Out[39]:
A    2.5
B    2.4
dtype: float64

Multiindexの特定の階層のラベルごとにまとめる

MultiIndexを持っているデータに対しては、level引数でどのラベルごとにまとめたいかを指定することができます。

In [40]: df_multi
Out[40]:
     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 [41]: df_multi.mean(level=0) # ('A','B')でまとめる
Out[41]:
     0    1    2         3         4
A  3.0  5.0  5.0  1.666667  1.666667
B  2.5  2.0  4.0  7.000000  4.500000

In [42]: df_multi.mean(level=1) # ('a','b')でまとめる
Out[42]:
          0    1    2         3         4
a  2.666667  6.0  5.0  1.666667  0.333333
b  3.000000  0.5  4.0  7.000000  6.500000

describe関数を使った求め方

describe関数はデフォルトで列ごとの平均などをまとめて求めてくれます。

In [43]: df.describe()
Out[43]:
              A         B
count  6.000000  5.000000
mean   2.500000  2.400000
std    1.870829  2.073644
min    0.000000  0.000000
25%    1.250000  1.000000
50%    2.500000  2.000000
75%    3.750000  4.000000
max    5.000000  5.000000

describe関数の詳しい使い方は以下の記事で解説しています。

PandasでDataFrameの統計情報を表示するdescribe関数の使い方 /features/pandas-describe.html

まとめ

今回は平均を求めるmean関数の使い方についてまとめました。 また、平均を含めた他の値も一気に求めることのできるdescribe関数についても少し触れました。

単に統計分析の文脈で使用する場合、平均値の値が知りたい場合は特別な指定をする必要がない限りはdescribe関数で事足りる上、他の情報も表示してくれます。そのため、普段のデータ分析ではdescribe関数の出番の方が多くなりますが、平均値をさらに加工したりする場合にはmean関数を使うと便利そうです。

参考