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
関数を使うと便利そうです。