Pandas groupby カウント

Suraj Joshi 2023年1月30日
  1. 一意な行値のカウント値を指定するメソッド Series.value_counts() を用いて
  2. DataFrame.groupby() 関数を用いた DataFrame グループの値のカウント
  3. pandas.DataFrame.agg() メソッドを用いて各グループの複数の統計値を取得する
Pandas groupby カウント

このチュートリアルでは、DataFrame.groupby() メソッドを使用して取得したグループについて、countsummax などの統計情報を取得する方法を説明します。

上の例で示した automobile_data_df を使って概念を説明します。DataFrame は従業員と、その従業員が使用している車や自転車のブランドから構成されています。

import pandas as pd

automobile_data = [
    ["Chevrolet", "Yamaha"],
    ["Toyota", "Ducati"],
    ["Volkswagen", "BMW"],
    ["Cherlovet", "Kawasaki"],
    ["Toyota", "Ducati"],
    ["Toyota", "BMW"],
    ["Volkswagen", "BMW"],
]

column_names = ["Car Brand", "Motorbike Brand"]
index_names = ["Steven", "Robert", "Jimmy", "Mike", "Phoenix", "Scott", "John"]
automobile_data_df = pd.DataFrame(
    automobile_data, index=index_names, columns=column_names
)
print(automobile_data_df)

出力:

          Car Brand Motorbike Brand
Steven    Chevrolet          Yamaha
Robert       Toyota          Ducati
Jimmy    Volkswagen             BMW
Mike      Cherlovet        Kawasaki
Phoenix      Toyota          Ducati
Scott        Toyota             BMW
John     Volkswagen             BMW

一意な行値のカウント値を指定するメソッド Series.value_counts() を用いて

DataFrame 内の単一カラムの一意な値のカウントを取得したい場合は、Series.value_count() メソッドを使用します。

import pandas as pd

automobile_data = [
    ["Chevrolet", "Yamaha"],
    ["Toyota", "Ducati"],
    ["Volkswagen", "BMW"],
    ["Cherlovet", "Kawasaki"],
    ["Toyota", "Ducati"],
    ["Toyota", "BMW"],
    ["Volkswagen", "BMW"],
]

column_names = ["Car Brand", "Motorbike Brand"]
index_names = ["Steven", "Robert", "Jimmy", "Mike", "Phoenix", "Scott", "John"]
automobile_data_df = pd.DataFrame(
    automobile_data, index=index_names, columns=column_names
)

print(automobile_data_df["Car Brand"].value_counts())

出力:

Toyota        3
Volkswagen    2
Cherlovet     1
Chevrolet     1
Name: Car Brand, dtype: int64

このメソッドは automobile_data_dfCar Brand カラムにあるすべての一意な値をカウントとともに出力します。このメソッドは、一度にひとつのカラムだけの値のカウントを見たい場合にのみ適用されます。

DataFrame.groupby() 関数を用いた DataFrame グループの値のカウント

関数 DataFrame.groupby() を用いて DataFrame を複数のグループに分割し、size() メソッドを用いて各グループの値をカウントします。

import pandas as pd

automobile_data = [
    ["Chevrolet", "Yamaha"],
    ["Toyota", "Ducati"],
    ["Volkswagen", "BMW"],
    ["Cherlovet", "Kawasaki"],
    ["Toyota", "Ducati"],
    ["Toyota", "BMW"],
    ["Volkswagen", "BMW"],
]

column_names = ["Car Brand", "Motorbike Brand"]
index_names = ["Steven", "Robert", "Jimmy", "Mike", "Phoenix", "Scott", "John"]
automobile_data_df = pd.DataFrame(
    automobile_data, index=index_names, columns=column_names
)

group = automobile_data_df.groupby(["Car Brand", "Motorbike Brand"])
print(group.size().reset_index(name="counts"))

出力:

    Car Brand Motorbike Brand  counts
0   Cherlovet        Kawasaki       1
1   Chevrolet          Yamaha       1
2      Toyota             BMW       1
3      Toyota          Ducati       2
4  Volkswagen             BMW       2

これは、automobile_data_dfCar BrandMotorbike Brand のカラムの値のユニークな組み合わせと、automobile_data_df DataFrame 内でのこれらの組み合わせの出現回数をまとめた DataFrame を出力します。

groupby() メソッドは automobile_data_df をグループに分割します。Car BrandMotorbike Brand のカラムの値が同じ行は同じグループに配置されます。size() メソッドで各グループの値の数を取得し、最後に各グループの値の数から DataFrame を生成します。

pandas.DataFrame.agg() メソッドを用いて各グループの複数の統計値を取得する

import pandas as pd

automobile_data = [
    ["Chevrolet", "Yamaha", 4000],
    ["Toyota", "Ducati", 5000],
    ["Volkswagen", "BMW", 4500],
    ["Cherlovet", "Kawasaki", 3800],
    ["Toyota", "Ducati", 4500],
    ["Toyota", "BMW", 5000],
    ["Volkswagen", "BMW", 6000],
]

column_names = ["Car Brand", "Motorbike Brand", "Monthly Salary"]
index_names = ["Steven", "Robert", "Jimmy", "Mike", "Phoenix", "Scott", "John"]
automobile_data_df = pd.DataFrame(
    automobile_data, index=index_names, columns=column_names
)

group = automobile_data_df.groupby(["Car Brand", "Motorbike Brand"])

print(group.agg({"Monthly Salary": [min, max, sum]}))

出力:

                           Monthly Salary             
                                      min   max    sum
Car Brand  Motorbike Brand                            
Cherlovet  Kawasaki                  3800  3800   3800
Chevrolet  Yamaha                    4000  4000   4000
Toyota     BMW                       5000  5000   5000
           Ducati                    4500  5000   9500
Volkswagen BMW                       4500  6000  10500

生成されたグループごとに Monthly Salary の最小値、最大値、合計値を表示します。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Pandas Groupby