[Python] Pandas – DataFrameで集約する方法【groupby/sum/mean/count】
PandasのDataFrameで集約を行うには、groupbyメソッドを使用します。
groupbyは指定した列でデータをグループ化し、集約関数を適用できます。
例えば、sumはグループごとの合計、meanは平均、countは要素数を計算します。
使用例として、df.groupby('列名').sum()は指定列でグループ化し、他の数値列の合計を計算します。
meanやcountも同様に使用できます。
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を積極的に活用し、より深い洞察を得るための一歩を踏み出してみてください。