Pandas

[Python] Pandas – DataFrameで集約する方法【groupby/sum/mean/count】

PandasのDataFrameで集約を行うには、groupbyメソッドを使用します。

groupbyは指定した列でデータをグループ化し、集約関数を適用できます。

例えば、sumはグループごとの合計、meanは平均、countは要素数を計算します。

使用例として、df.groupby('列名').sum()は指定列でグループ化し、他の数値列の合計を計算します。

meancountも同様に使用できます。

groupbyメソッドの基本

Pandasのgroupbyメソッドは、データを特定のキーでグループ化し、集約処理を行うための強力なツールです。

このセクションでは、groupbyメソッドの基本的な使い方や、複数列でのグループ化、戻り値について解説します。

groupbyの基本的な使い方

groupbyメソッドを使用することで、指定した列に基づいてデータをグループ化できます。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計を計算
grouped = df.groupby('カテゴリ')['値'].sum()
print(grouped)
カテゴリ
A    90
B    60
Name: 値, dtype: int64

この例では、カテゴリ列でデータをグループ化し、各グループのの合計を計算しています。

複数列でのグループ化

複数の列を指定してグループ化することも可能です。

以下の例では、カテゴリサブカテゴリの2つの列でグループ化しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    'サブカテゴリ': ['X', 'Y', 'X', 'Y', 'X'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'と'サブカテゴリ'でグループ化し、'値'の合計を計算
grouped = df.groupby(['カテゴリ', 'サブカテゴリ'])['値'].sum()
print(grouped)
  カテゴリ  サブカテゴリ
A      X            60
       Y            20
B      X            30
       Y            40
Name: 値, dtype: int64

このように、複数の列を指定することで、より詳細なグループ化が可能になります。

groupbyの戻り値について

groupbyメソッドの戻り値は、DataFrameGroupByオブジェクトです。

このオブジェクトは、集約や変換を行うためのメソッドを持っています。

例えば、sum()mean()などの集約関数を適用することができます。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化
grouped = df.groupby('カテゴリ')
# 戻り値の型を確認
print(type(grouped))
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

このように、groupbyメソッドの戻り値はDataFrameGroupByオブジェクトであり、集約処理を行うための基盤となります。

groupbyと他のメソッドの組み合わせ

groupbyメソッドは、他のメソッドと組み合わせて使用することで、より複雑なデータ処理が可能です。

例えば、agg()メソッドを使って、異なる集約関数を同時に適用することができます。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計と平均を計算
result = df.groupby('カテゴリ')['値'].agg(['sum', 'mean'])
print(result)
      sum  mean
カテゴリ
A      90  30.0
B      60  30.0

このように、groupbyメソッドと他の集約メソッドを組み合わせることで、データの分析がより効率的に行えます。

sum関数を使った集約

Pandasのsum関数は、指定した列の合計を計算するための便利なメソッドです。

このセクションでは、sum関数の基本的な使い方や、複数列の合計計算、欠損値(NaN)がある場合の挙動、さらには応用例について解説します。

sum関数の基本的な使い方

sum関数は、groupbyメソッドと組み合わせて使用することが一般的です。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計を計算
grouped_sum = df.groupby('カテゴリ')['値'].sum()
print(grouped_sum)
カテゴリ
A    90
B    60
Name: 値, dtype: int64

この例では、カテゴリごとにの合計を計算しています。

複数列の合計を計算する

複数の列を指定して合計を計算することも可能です。

以下の例では、カテゴリサブカテゴリの2つの列でグループ化し、合計を計算しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    'サブカテゴリ': ['X', 'Y', 'X', 'Y', 'X'],
    '値1': [10, 20, 30, 40, 50],
    '値2': [5, 15, 25, 35, 45]
}
df = pd.DataFrame(data)
# 'カテゴリ'と'サブカテゴリ'でグループ化し、'値1'と'値2'の合計を計算
grouped_sum = df.groupby(['カテゴリ', 'サブカテゴリ'])[['値1', '値2']].sum()
print(grouped_sum)
             値1  値2
カテゴリ サブカテゴリ        
A    X       60  50
     Y       20  15
B    X       30  25
     Y       40  35

このように、複数の列を指定することで、各グループの合計を同時に計算できます。

欠損値(NaN)がある場合の挙動

sum関数は、デフォルトで欠損値(NaN)を無視して合計を計算します。

以下の例では、欠損値を含むデータの合計を計算しています。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, np.nan, 30, 40, np.nan]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計を計算
grouped_sum = df.groupby('カテゴリ')['値'].sum()
print(grouped_sum)
カテゴリ
A    40.0
B    40.0
Name: 値, dtype: float64

このように、sum関数は欠損値を無視して合計を計算します。

sum関数の応用例

sum関数は、さまざまなデータ分析のシナリオで応用できます。

以下は、売上データの合計を計算する例です。

import pandas as pd
# サンプルデータの作成
data = {
    '店舗': ['A', 'B', 'A', 'B', 'A'],
    '売上': [100, 200, 150, 300, 250]
}
df = pd.DataFrame(data)
# '店舗'でグループ化し、'売上'の合計を計算
total_sales = df.groupby('店舗')['売上'].sum()
print(total_sales)
店舗
A    500
B    500
Name: 売上, dtype: int64

このように、sum関数を使用することで、店舗ごとの売上の合計を簡単に計算できます。

mean関数を使った集約

Pandasのmean関数は、指定した列の平均値を計算するための便利なメソッドです。

このセクションでは、mean関数の基本的な使い方や、グループごとの平均値計算、欠損値(NaN)がある場合の平均計算、さらには応用例について解説します。

mean関数の基本的な使い方

mean関数は、groupbyメソッドと組み合わせて使用することが一般的です。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の平均を計算
grouped_mean = df.groupby('カテゴリ')['値'].mean()
print(grouped_mean)
カテゴリ
A    30.0
B    30.0
Name: 値, dtype: float64

この例では、カテゴリごとにの平均を計算しています。

グループごとの平均値を計算する

複数の列を指定して平均を計算することも可能です。

以下の例では、カテゴリサブカテゴリの2つの列でグループ化し、平均を計算しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    'サブカテゴリ': ['X', 'Y', 'X', 'Y', 'X'],
    '値1': [10, 20, 30, 40, 50],
    '値2': [5, 15, 25, 35, 45]
}
df = pd.DataFrame(data)
# 'カテゴリ'と'サブカテゴリ'でグループ化し、'値1'と'値2'の平均を計算
grouped_mean = df.groupby(['カテゴリ', 'サブカテゴリ'])[['値1', '値2']].mean()
print(grouped_mean)
               値1    値2
カテゴリ サブカテゴリ
A    X       30.0  25.0
     Y       20.0  15.0
B    X       30.0  25.0
     Y       40.0  35.0

このように、複数の列を指定することで、各グループの平均を同時に計算できます。

欠損値(NaN)がある場合の平均計算

mean関数は、デフォルトで欠損値(NaN)を無視して平均を計算します。

以下の例では、欠損値を含むデータの平均を計算しています。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, np.nan, 30, 40, np.nan]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の平均を計算
grouped_mean = df.groupby('カテゴリ')['値'].mean()
print(grouped_mean)
カテゴリ
A    20.0
B    40.0
Name: 値, dtype: float64

このように、mean関数は欠損値を無視して平均を計算します。

mean関数の応用例

mean関数は、さまざまなデータ分析のシナリオで応用できます。

以下は、学生の成績データの平均を計算する例です。

import pandas as pd
# サンプルデータの作成
data = {
    '学生': ['田中', '鈴木', '佐藤', '田中', '鈴木'],
    '科目': ['数学', '数学', '英語', '英語', '数学'],
    '点数': [80, 90, 70, 85, 95]
}
df = pd.DataFrame(data)
# '学生'でグループ化し、'点数'の平均を計算
average_scores = df.groupby('学生')['点数'].mean()
print(average_scores)
学生
佐藤    70.0
鈴木    92.5
田中    82.5
Name: 点数, dtype: float64

このように、mean関数を使用することで、学生ごとの成績の平均を簡単に計算できます。

count関数を使った集約

Pandasのcount関数は、指定した列の要素数をカウントするための便利なメソッドです。

このセクションでは、count関数の基本的な使い方や、グループごとの要素数のカウント、欠損値(NaN)を含むデータのカウント、さらには応用例について解説します。

count関数の基本的な使い方

count関数は、groupbyメソッドと組み合わせて使用することが一般的です。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の要素数をカウント
grouped_count = df.groupby('カテゴリ')['値'].count()
print(grouped_count)
カテゴリ
A    3
B    2
Name: 値, dtype: int64

この例では、カテゴリごとにの要素数をカウントしています。

グループごとの要素数をカウントする

複数の列を指定して要素数をカウントすることも可能です。

以下の例では、カテゴリサブカテゴリの2つの列でグループ化し、要素数をカウントしています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    'サブカテゴリ': ['X', 'Y', 'X', 'Y', 'X'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'と'サブカテゴリ'でグループ化し、要素数をカウント
grouped_count = df.groupby(['カテゴリ', 'サブカテゴリ'])['値'].count()
print(grouped_count)
カテゴリ  サブカテゴリ
A     X         2
      Y         1
B     X         1
      Y         1
Name: 値, dtype: int64

このように、複数の列を指定することで、各グループの要素数を同時にカウントできます。

欠損値(NaN)を含むデータのカウント

count関数は、欠損値(NaN)を無視してカウントを行います。

以下の例では、欠損値を含むデータの要素数をカウントしています。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, np.nan, 30, 40, np.nan]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の要素数をカウント
grouped_count = df.groupby('カテゴリ')['値'].count()
print(grouped_count)
カテゴリ
A    2
B    2
Name: 値, dtype: int64

このように、count関数は欠損値を無視して要素数をカウントします。

count関数の応用例

count関数は、さまざまなデータ分析のシナリオで応用できます。

以下は、顧客データのカウントを行う例です。

import pandas as pd
# サンプルデータの作成
data = {
    '顧客ID': [1, 2, 3, 4, 5, 6],
    '購入カテゴリ': ['A', 'B', 'A', 'B', 'A', 'C'],
    '購入金額': [100, 200, 150, 300, 250, 400]
}
df = pd.DataFrame(data)
# '購入カテゴリ'でグループ化し、顧客数をカウント
customer_count = df.groupby('購入カテゴリ')['顧客ID'].count()
print(customer_count)
購入カテゴリ
A    3
B    2
C    1
Name: 顧客ID, dtype: int64

このように、count関数を使用することで、各購入カテゴリごとの顧客数を簡単にカウントできます。

複数の集約関数を同時に使う

Pandasでは、aggメソッドを使用することで、複数の集約関数を同時に適用することができます。

このセクションでは、aggメソッドの使い方や、複数の列に異なる集約関数を適用する方法、複数の集約結果を一度に取得する方法、さらにはカスタム集約関数の作成について解説します。

aggメソッドの使い方

aggメソッドは、groupbyオブジェクトに対して使用し、指定した集約関数を適用するためのメソッドです。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計と平均を計算
result = df.groupby('カテゴリ')['値'].agg(['sum', 'mean'])
print(result)
sum  mean
カテゴリ
A           90  30.0
B           60  30.0

この例では、カテゴリごとにの合計と平均を同時に計算しています。

複数の列に異なる集約関数を適用する

aggメソッドを使用することで、複数の列に異なる集約関数を適用することも可能です。

以下の例では、値1値2の列に対して異なる集約関数を適用しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値1': [10, 20, 30, 40, 50],
    '値2': [5, 15, 25, 35, 45]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値1'の合計と'値2'の平均を計算
result = df.groupby('カテゴリ').agg({'値1': 'sum', '値2': 'mean'})
print(result)
      値1         値2
カテゴリ
A     80  21.666667
B     70  30.000000

このように、異なる列に対して異なる集約関数を適用することができます。

複数の集約結果を一度に取得する

aggメソッドを使用することで、複数の集約結果を一度に取得することができます。

以下の例では、列に対して複数の集約関数を適用しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、'値'の合計、平均、カウントを計算
result = df.groupby('カテゴリ')['値'].agg(['sum', 'mean', 'count'])
print(result)
      sum  mean  count
カテゴリ
A      90  30.0      3
B      60  30.0      2

このように、aggメソッドを使用することで、複数の集約結果を一度に取得できます。

カスタム集約関数の作成

aggメソッドでは、カスタム集約関数を作成して適用することも可能です。

以下の例では、カスタム関数を定義し、列に適用しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# カスタム集約関数の定義
def custom_function(x):
    return x.max() - x.min()  # 最大値と最小値の差を計算
# 'カテゴリ'でグループ化し、カスタム関数を適用
result = df.groupby('カテゴリ')['値'].agg(custom_function)
print(result)
カテゴリ
A    40
B    20
Name: 値, dtype: int64

このように、カスタム集約関数を使用することで、特定の要件に応じた集約処理を行うことができます。

グループ化したデータのフィルタリング

Pandasでは、グループ化したデータに対してフィルタリングを行うことができます。

これにより、特定の条件を満たすグループのみを抽出することが可能です。

このセクションでは、filterメソッドの使い方や、特定の条件に基づくグループの抽出、グループ化後のデータの再構成について解説します。

filterメソッドの使い方

filterメソッドは、グループ化したデータに対して条件を指定し、その条件を満たすグループのみを抽出するためのメソッドです。

以下は、基本的な使い方の例です。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、合計が40以上のグループを抽出
filtered = df.groupby('カテゴリ').filter(lambda x: x['値'].sum() >= 40)
print(filtered)
  カテゴリ   値
0    A  10
1    A  20
2    B  30
3    B  40
4    A  50

この例では、カテゴリごとにの合計が40以上のグループを抽出しています。

特定の条件に基づくグループの抽出

filterメソッドを使用することで、特定の条件に基づいてグループを抽出することができます。

以下の例では、の平均が30以上のグループを抽出しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、平均が30以上のグループを抽出
filtered = df.groupby('カテゴリ').filter(lambda x: x['値'].mean() >= 30)
print(filtered)
  カテゴリ   値
2    B  30
3    B  40

このように、特定の条件に基づいてグループを抽出することができます。

グループ化後のデータの再構成

グループ化したデータをフィルタリングした後、再構成することも可能です。

以下の例では、フィルタリングしたデータを元に新しいDataFrameを作成しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、合計が40以上のグループを抽出
filtered = df.groupby('カテゴリ').filter(lambda x: x['値'].sum() >= 40)
# フィルタリングしたデータを元に新しいDataFrameを作成
new_df = filtered.reset_index(drop=True)
print(new_df)
  カテゴリ   値
0    A  10
1    A  20
2    B  30
3    B  40
4    A  50

このように、フィルタリングしたデータを再構成することで、新しいDataFrameを作成することができます。

これにより、必要なデータを効率的に抽出し、分析を行うことが可能になります。

応用例:複雑な集約処理

Pandasを使用すると、複雑な集約処理を簡単に行うことができます。

このセクションでは、複数の集約関数を組み合わせた高度な集約、グループごとのデータの変換と集約、時系列データの集約、カテゴリデータの集約について解説します。

複数の集約関数を組み合わせた高度な集約

aggメソッドを使用することで、複数の集約関数を組み合わせて高度な集約を行うことができます。

以下の例では、列に対して合計、平均、最大値、最小値を同時に計算しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、複数の集約関数を適用
result = df.groupby('カテゴリ')['値'].agg(['sum', 'mean', 'max', 'min'])
print(result)
      sum       mean  max  min
カテゴリ
A      80  26.666667   50   10
B      70  35.000000   40   30

このように、複数の集約関数を組み合わせることで、詳細な集約結果を得ることができます。

グループごとのデータの変換と集約

transformメソッドを使用することで、グループごとのデータを変換しながら集約することができます。

以下の例では、各グループの平均値を計算し、その結果を元のDataFrameに追加しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'A', 'B', 'B', 'A'],
    '値': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、各グループの平均値を計算
df['平均値'] = df.groupby('カテゴリ')['値'].transform('mean')
print(df)
カテゴリ  値  平均値
0      A  10  26.67
1      A  20  26.67
2      B  30  35.00
3      B  40  35.00
4      A  50  26.67

このように、transformメソッドを使用することで、グループごとの集約結果を元のデータに反映させることができます。

時系列データの集約

時系列データの集約は、特にデータ分析において重要な処理です。

以下の例では、日付ごとの売上データを集約し、日ごとの合計を計算しています。

import pandas as pd
# サンプルデータの作成
data = {
    '日付': pd.date_range(start='2023-01-01', periods=5, freq='D'),
    '売上': [100, 200, 150, 300, 250]
}
df = pd.DataFrame(data)
# 日付でグループ化し、売上の合計を計算
daily_sales = df.groupby('日付')['売上'].sum()
print(daily_sales)
日付
2023-01-01    100
2023-01-02    200
2023-01-03    150
2023-01-04    300
2023-01-05    250
Name: 売上, dtype: int64

このように、時系列データをグループ化して集約することで、日ごとの売上を簡単に把握できます。

カテゴリデータの集約

カテゴリデータの集約も重要な処理です。

以下の例では、カテゴリごとの売上データを集約し、合計を計算しています。

import pandas as pd
# サンプルデータの作成
data = {
    'カテゴリ': ['A', 'B', 'A', 'B', 'A'],
    '売上': [100, 200, 150, 300, 250]
}
df = pd.DataFrame(data)
# 'カテゴリ'でグループ化し、売上の合計を計算
category_sales = df.groupby('カテゴリ')['売上'].sum()
print(category_sales)
カテゴリ
A    500
B    500
Name: 売上, dtype: int64

このように、カテゴリデータを集約することで、各カテゴリの売上を簡単に把握できます。

これにより、ビジネスの意思決定に役立つ情報を得ることができます。

まとめ

この記事では、Pandasを使用したデータの集約処理について、基本的な使い方から応用例まで幅広く解説しました。

特に、groupbyメソッドや各種集約関数を活用することで、データ分析を効率的に行う方法を紹介しました。

これを機に、実際のデータ分析においてPandasを積極的に活用し、より深い洞察を得るための一歩を踏み出してみてください。

関連記事

Back to top button