Skip to content

[解説] Python、Pandas、PySparkでのデータフレームのグループ化方法

Updated on

データのグループ化は、集計や複雑な変換を行うためのデータ分析の重要な部分です。Pythonのpandas groupby関数は、このような操作を効率的に行うための堅牢で多機能なツールです。その広範な機能により、特定の条件に基づいてグループ化されたデータの操作をスムーズに行うことができます。

pandas groupby関数は、最適化された実装により、特に大規模なデータフレームの操作に強力です。pandas dataframe groupbyを利用することで、単一または複数の列でグループ化し、複数の集計関数を適用し、グループ化されたデータのフィルタリングやソートなどの高度なタスクさえも行うことができます。このガイドでは、pandas groupby関数のパワーを解き明かし、インサイト、ベストプラクティス、実践的な例を提供します。

Python Pandas Dataframeから簡単にデータ可視化を作成するには、No codeでPyGWalker (opens in a new tab)を使用できます。

PyGWalkerは、可視化を伴う探索的データ解析(EDA)のためのPythonライブラリです。PyGWalker (opens in a new tab)は、pandas dataframe(およびpolars dataframe)をTableauのようなユーザーインターフェースに変換することで、Jupyter Notebookのデータ分析とデータ可視化のワークフローを簡素化できます。

PyGWalker for Data visualization (opens in a new tab)

Pandas GroupByの理解

単純に言えば、pandas groupby操作はデータを特定の基準に基づいてグループに分割し、各グループに対して関数を適用し、その結果を組み合わせるというプロセスです。このプロセスは、「分割-適用-結合」という戦略としても知られており、pandasライブラリ自体によって作られた用語です。

Pandasのgroupby関数は、SQLのGROUP BY文と同様の概念を使用しており、データ分析のためにSQLからPythonに移行する場合にも便利です。

以下は、pandas dataframe groupbyの使い方の基本的な例です:

import pandas as pd
 
## サンプルのデータフレームの作成
data = {
    'Name': ['John', 'Anna', 'John', 'Anna', 'John', 'Anna'],
    'Subject': ['Maths', 'Maths', 'Physics', 'Physics', 'Chemistry', 'Chemistry'],
    'Score': [85, 90, 78, 88, 92, 95]
}
 
df = pd.DataFrame(data)
 
## groupbyの適用
grouped = df.groupby('Name')
for name, group in grouped:
    print("\n", name)
    print(group)

複数の列でグループ化

pandas groupbyは、単一の列だけでなく、複数の列でのグループ化もサポートしています。これは、複数の属性に基づいてデータを分類したい場合に特に便利です。前の例を拡張し、pandas groupby multiple columns操作を行ってみましょう:

## 複数の列でgroupbyを適用
grouped_multiple = df.groupby(['Name', 'Subject'])
for (name, subject), group in grouped_multiple:
    print("\n", name, subject)
    print(group)

見ての通り、pandas dataframe groupbyはまずデータを'Name'でグループ化し、その後各'Name'グループ内で'Subject'でグループ化しました。このようなグループ化を利用すると、複雑なデータ分析操作が可能になります。

Pandas GroupByでの集計関数

pandas groupbyの最大の利点の一つは、グループ化されたデータに集計関数を適用できることです。一般的な集計関数にはsummeancountmaxminなどがあります。pandas groupby and sumを使用した例を見てみましょう:

## sum関数をgroupbyと使用する
grouped_sum = df.groupby('Name')['Score'].sum()
print(grouped_sum)
 
 

この例では、各学生のスコアを合計しています。sum関数は数値データにのみ適用できるため、groupbyの直後にカラムインデクサ(['Score'])を使用しています。これにより、sum関数を適用するために'Score'カラムを選択する必要があります。

Pandas GroupByでのデータのソート

グループ化操作の後にデータをソートすることは一般的です。たとえば、グループを集計値でソートしたい場合があります。groupby sort values in pandasのようにしてグループ化されたデータをソートする方法は次の通りです:

## グループ化後のデータのソート
grouped_sorted = df.groupby('Name')['Score'].sum().sort_values(ascending=False)
print(grouped_sorted)

この例では、まずデータフレームを'Name'でグループ化し、次に各グループの'Score'を合計し、最後に'Score'の合計値でグループを降順にソートしました。

GroupBy Applyでのカスタム集計

pandas groupbyでは、apply関数を使用してカスタム集計を行うことができます。これは、組み込みの集計関数では十分ではない場合に便利です。たとえば、各学生のスコアの範囲(最大値-最小値)を計算したい場合を考えてみましょう。groupby apply in pandasを使用して、次のようにカスタム集計を行うことができます:

## GroupBy Applyでのカスタム集計
grouped_apply = df.groupby('Name')['Score'].apply(lambda x: x.max() - x.min())
print(grouped_apply)

この例では、各グループごとに、ラムダ関数を使用して'Score'の範囲を計算し、この関数をapplyで各グループに適用しています。

GroupByとPivotの違い

pandas groupbyとピボットテーブルは、データの要約には有力なツールですが、異なる目的で使用され、異なるコンテキストで使用されます。例えば、pandas groupbyはカテゴリに基づいてデータを要約するために使用されますが、ピボットテーブルはデータを再形成するために使用されます。

pandas groupby操作では、グループ化する列または複数の列を指定し、各グループに適用する集計関数を指定します。一方、ピボットテーブルは単純な列指向のデータを入力とし、エントリを多次元の分析を提供する二次元のテーブルにグループ化します。

Pandasで非数値データをGroupByする

Pandasでは、非数値データをgroupbyすることができます。summeanのような集計関数は非数値データには適用できませんが、カテゴリごとの出現回数を数えるなど、非数値データに対して意味のある関数を適用することはたくさんあります。

## 非数値データのGroupbyとカウント
grouped_count = df.groupby('Name')['Subject'].count()
print(grouped_count)

この例では、'Name'でグループ化し、'Subject'のカウントを行っています。

PySparkでのGroupBy

groupbyの概念はPySparkなどのビッグデータフレームワークにも適用されます。構文は若干異なりますが、アイデアは同じです。データをグループに分割し、各グループに対していくつかの関数を適用するというものです。

## PySparkでのGroupBy
from pyspark.sql import SparkSession
 
spark = SparkSession.builder.getOrCreate()
 
## PySpark DataFrameにデータをロード
df_pyspark = spark.createDataFrame(df)
 
## PySparkでのGroupBy
df_pyspark.groupby('Name').agg({'Score': 'sum'}).show()

PySparkでは、グループ化後に集計関数を適用するためにagg関数を使用する必要があります。上記の例では、'Name'でグループ化し、各グループの'Score'を合計しています。

Pythonを使ったデータ分析の領域に深入りするにつれて、pandas dataframe groupbyは頼りになる相棒であることがわかるでしょう。その柔軟性とパワーにより、プログラミングや統計のバックグラウンドを持っていない人でもデータを扱い、探索的な分析を行うことができます。さあ、様々な機能を試して、データが貴重な洞察をもたらす様子を見守りましょう!

よくある質問

  1. groupbyとピボットの違いは何ですか?

Pandasのgroupbyはカテゴリに基づいてデータを要約するために使用され、ピボットテーブルはデータを多次元の分析を提供するために二次元のテーブルに再形成するために使用されます。

  1. Pandasで非数値データをgroupbyできますか?

はい、Pandasでは非数値データをgroupbyできます。summeanなどの集計関数は非数値データには適用できませんが、各カテゴリの出現回数をカウントするなど、他の操作はたくさんあります。

  1. PySparkでgroupbyを使うにはどうすればいいですか?

PySparkでは、groupbyの概念はPandasと同様です。グループ化後、各グループに対して集計関数を適用するためにagg関数を使用する必要があります。