pandas.DataFrame.aggregateで集計マスターに! サンプルコード満載で、あなたも今日からデータ分析をレベルアップ


基本的な使い方

aggregate() 関数は、単一の列に対して集約関数を実行したり、複数の列に対して異なる集約関数を実行したりすることができます。

単一の列に対する集約

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8]})

# 列 'A' の平均を計算
df['A'].aggregate(mean)

このコードは、列 'A' の平均を計算し、結果を Series として返します。

複数の列に対する集約

# 列 'A' の平均と列 'B' の合計を計算
df.aggregate({'A': 'mean', 'B': 'sum'})

このコードは、列 'A' の平均と列 'B' の合計を計算し、結果を DataFrame として返します。

グループ化による集約

aggregate() 関数は、groupby() 関数と組み合わせて、グループ化されたデータの集約を実行することができます。

# 列 'B' でグループ化し、各グループの列 'A' の平均を計算
df.groupby('B')['A'].aggregate(mean)

このコードは、列 'B' でデータフレームをグループ化し、各グループの列 'A' の平均を計算します。結果は、グループキーと平均値を含む新しい DataFrame として返されます。

aggregate() 関数は、ユーザー定義の関数を集約関数として渡すこともできます。

def custom_agg(series):
    return series.sum() / series.count()

# 列 'A' に対してカスタム集約関数 'custom_agg' を適用
df['A'].aggregate(custom_agg)

このコードは、custom_agg() 関数を使用して列 'A' の集約を行います。この関数は、シリーズの合計をシリーズの個数で除算し、平均のような値を返します。

aggregate() 関数は、axis 引数を使用して集約軸を指定したり、rename 引数を使用して結果の列名を変更したりするなど、他にも多くのオプションを提供しています。詳細は、pandas のドキュメントを参照してください。



例 1:様々な集約関数を使用する

この例では、様々な集約関数を使用して、データフレームの統計量を計算する方法を示します。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 各列の統計量を計算
df.aggregate(['mean', 'min', 'max', 'std'])

このコードは以下の結果を出力します。

       A         B           C
mean  3.000000  3.400000  NaN
min   1.000000  1.000000  a
max   5.000000  7.000000  e
std   1.581138  2.236068  NaN

例 2:グループ化による集約

この例では、groupby() 関数と組み合わせて、グループ化されたデータの集約を実行する方法を示します。

# 列 'B' でグループ化し、各グループの統計量を計算
df.groupby('B').aggregate(['mean', 'min', 'max', 'std'])
       A         C
B mean  min  max  std count
1  2.000000  1.000000  3.000000  1.414214  2
2  3.000000  2.000000  4.000000  1.000000  1
3  5.000000  5.000000  5.000000  0.000000  1

この例では、ユーザー定義の関数を集約関数として渡す方法を示します。

import pandas as pd

def custom_agg(series):
    return series.sum() / series.count()

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 列 'A' に対してカスタム集約関数 'custom_agg' を適用
df['A'].aggregate(custom_agg)
0.600000

この例では、custom_agg() 関数はシリーズの合計をシリーズの個数で除算し、平均のような値を返します。



関数適用

単純な集約操作の場合は、apply() 関数と組み合わせて、列に直接関数を実行することができます。この方法は、簡潔で読みやすいコードを作成できるという利点があります。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 列 'A' の平均を計算
def mean(series):
    return series.mean()

df['A'].apply(mean)

しかし、この方法は、より複雑な集約操作には向いていません。

ループによる反復処理

少数の列に対して集約を行う場合は、ループを使用して列を反復処理し、必要な計算を実行することができます。この方法は、柔軟性が高いという利点がありますが、コードが冗長になり、読みづらくなる可能性があります。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 列 'A' と 'B' の平均を計算
means = []
for col in ['A', 'B']:
    means.append(df[col].mean())

print(means)

グループ化による集計

groupby() 関数と組み合わせて、グループ化されたデータの集約を実行することができます。この方法は、グループごとの集計を簡単に行うことができるという利点があります。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 列 'B' でグループ化し、各グループの列 'A' の平均を計算
df.groupby('B')['A'].mean()

pivot_table 関数

集約とピボットテーブル操作を組み合わせる場合は、pivot_table 関数を使用することができます。この関数は、集計結果をわかりやすい表形式で表示できるという利点があります。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 1, 2, 3], 'C': ['a', 'b', 'c', 'd', 'e']})

# 列 'B' でピボットテーブルを作成し、列 'A' の平均を計算
df.pivot_table(values='A', index='B', aggfunc=pd.Series.mean)

しかし、この方法は、単純な集約操作には向いていません。

SQLによるクエリ

データフレームが大きい場合は、SQLを使用してデータベースに対して直接クエリを実行する方が効率的な場合があります。この方法は、大規模なデータセットを扱う場合にパフォーマンスを向上させることができるという利点があります。

SELECT B, AVG(A) AS mean_a
FROM your_table
GROUP BY B;

しかし、この方法は、SQL に慣れていない場合にとっては難易度が高くなります。

どの代替方法が最適かは、データセットのサイズ、必要な集約操作の複雑さ、個人の好みによって異なります。それぞれの方法の利点と欠点を比較検討し、状況に合ったものを選択することが重要です。

  • データ分析ライブラリによっては、pandas.DataFrame.aggregate() 関数と同様の機能を提供しているものもあります。