Pandas
今回はPandasで特定の範囲の統計値を算出する方法に関して解説していきます。
Pandasで簡単に算出できる統計値として、前に合計値(sum)、平均値(mean)、中央値(median)、最大値(max)、最小値(min)、標準偏差(std)を紹介しました。
ただしその際は列や行全体の値に対しての算出値となっていました。
そして特定の範囲だけの統計値を算出する方法は調べてもなかなか出てこなかったので、今回まとめてみようと思ったわけです。
まずはPandasの統計値の計算方法のおさらいから。
例えば各列における平均値を計算する方法はこんな感じでした。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
df.loc['Average'] = df.mean()
print(df)
実行結果
A B C D E
0 1.0 2.0 3.0 4.0 5.0
1 2.0 4.0 6.0 8.0 10.0
2 3.0 6.0 9.0 12.0 15.0
3 4.0 8.0 12.0 16.0 20.0
4 5.0 10.0 15.0 20.0 25.0
Average 3.0 6.0 9.0 12.0 15.0
そして各行に対して平均値を計算する方法はこんな感じです。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
df['Average'] = df.mean(axis=1)
print(df)
実行結果
A B C D E Average
0 1 2 3 4 5 3.0
1 2 4 6 8 10 6.0
2 3 6 9 12 15 9.0
3 4 8 12 16 20 12.0
4 5 10 15 20 25 15.0
つまり「データフレーム名.mean()」で各列における平均値、そしてオプションに「axis=1」を追加すると各行における平均値が計算できるというわけです。
ちなみに「データフレーム名.mean()」の状態では「axis=0」がデフォルトで指定されている状態です。
また「axis=0」は「axis=’index’」、「axis=1」は「axis=’columns’」と書き換えることもできます。
ここまでが簡単なおさらいで、ここからが本題。
各列の特定の範囲だけの統計値を計算する方法
まずは各列において、特定の範囲だけの統計値を計算する方法です。
例えば上の例で使ったこんな感じの表があるとするとしましょう。
1 | 2 | 3 | 4 | 5 |
2 | 4 | 6 | 8 | 10 |
3 | 6 | 9 | 12 | 15 |
4 | 8 | 12 | 16 | 20 |
5 | 10 | 15 | 20 | 25 |
そして、この表の3行目から5行目までの平均値を出したいとしましょう。
この場合には「iloc関数」を使って、こんな感じで表現します。
「iloc関数」の使い方としては、「データフレーム名.iloc[行, 列]」です。
そしてそれぞれの行、列は範囲で指定することもできます。
例えば「df.iloc[2:5, 3:6]」だとdfというデータフレームの行インデックスの2から5、列インデックスの3から6となります。
またインデックスは0から始まることと、範囲の指定では終わりの数字は含まないことから、3行目から5行目、4列目から6列目までを取得するということになります。
ということで先ほどの表で各列の3行目から5行目の平均値を取得するには「df.iloc[2:5].mean()」となります。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
df.loc['Average'] = df.iloc[2:5].mean()
print(df)
実行結果
A B C D E
0 1.0 2.0 3.0 4.0 5.0
1 2.0 4.0 6.0 8.0 10.0
2 3.0 6.0 9.0 12.0 15.0
3 4.0 8.0 12.0 16.0 20.0
4 5.0 10.0 15.0 20.0 25.0
Average 4.0 8.0 12.0 16.0 20.0
各行の特定の範囲だけの統計値を計算する方法
次に各行において、特定の範囲だけの統計値を計算する方法です。
これは先ほどの「各列の特定の範囲だけの統計値を計算する方法」を少し変えることで計算できます。
まず行の平均値を計算するため、meanのオプションとして「axis=1」を追加します。
そして「iloc関数」の範囲の指定は、行はすべてを表す「:」、列は特定の領域を指定します。
下の例では「2:5」として、3行目から5行目までを指定してみました。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
df['Average'] = df.iloc[:, 2:5].mean(axis=1)
print(df)
A B C D E Average
0 1 2 3 4 5 4.0
1 2 4 6 8 10 8.0
2 3 6 9 12 15 12.0
3 4 8 12 16 20 16.0
4 5 10 15 20 25 20.0
今回の例としては平均値を用いましたが、標準偏差(std)や中央値(median)でも同じように各行、各列の特定の範囲において計算できました。
統計情報を一覧表示するdescribeでも使えるのか?
次に気になるのは、統計情報を一覧表示できる「describe関数」でも同じように範囲指定できるかです。
「describe関数」に関してはこちらの記事で紹介していますので、良かったらどうぞ。
簡単に解説すると「データフレーム名.describe()」で統計情報を一覧で出してくれます。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
print(df.describe())
実行結果
A B C D E
count 5.000000 5.000000 5.000000 5.000000 5.000000
mean 3.000000 6.000000 9.000000 12.000000 15.000000
std 1.581139 3.162278 4.743416 6.324555 7.905694
min 1.000000 2.000000 3.000000 4.000000 5.000000
25% 2.000000 4.000000 6.000000 8.000000 10.000000
50% 3.000000 6.000000 9.000000 12.000000 15.000000
75% 4.000000 8.000000 12.000000 16.000000 20.000000
max 5.000000 10.000000 15.000000 20.000000 25.000000
これも先ほど同様に「iloc関数」を使って範囲指定してみましょう。
import pandas as pd
df = pd.DataFrame(data={'A':[1, 2, 3, 4, 5],
'B':[2, 4, 6, 8, 10],
'C':[3, 6, 9, 12, 15],
'D':[4, 8, 12, 16, 20],
'E':[5, 10, 15, 20, 25]
})
print(df.iloc[2:5].describe())
print(df.iloc[:, 2:5].describe())
実行結果
A B C D E
count 3.0 3.0 3.0 3.0 3.0
mean 4.0 8.0 12.0 16.0 20.0
std 1.0 2.0 3.0 4.0 5.0
min 3.0 6.0 9.0 12.0 15.0
25% 3.5 7.0 10.5 14.0 17.5
50% 4.0 8.0 12.0 16.0 20.0
75% 4.5 9.0 13.5 18.0 22.5
max 5.0 10.0 15.0 20.0 25.0
C D E
count 5.000000 5.000000 5.000000
mean 9.000000 12.000000 15.000000
std 4.743416 6.324555 7.905694
min 3.000000 4.000000 5.000000
25% 6.000000 8.000000 10.000000
50% 9.000000 12.000000 15.000000
75% 12.000000 16.000000 20.000000
max 15.000000 20.000000 25.000000
「describe関数」においても同じように範囲を指定して算出することができました。
ではでは今回はこんな感じで。
コメント