[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を積極的に活用し、より深い洞察を得るための一歩を踏み出してみてください。