【Pandas】データフレームの行、列で範囲指定して平均値などの統計値を算出する方法[Python]

  • URLをコピーしました!
目次

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’」と書き換えることもできます。

ここまでが簡単なおさらいで、ここからが本題。

各列の特定の範囲だけの統計値を計算する方法

まずは各列において、特定の範囲だけの統計値を計算する方法です。

例えば上の例で使ったこんな感じの表があるとするとしましょう。

10
1215
121620
10152025

そして、この表の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関数」においても同じように範囲を指定して算出することができました。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次