[解説] Python、Pandas、PySparkでのデータフレームのグループ化方法
Published 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のデータ分析とデータ可視化のワークフローを簡素化できます。
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
の最大の利点の一つは、グループ化されたデータに集計関数を適用できることです。一般的な集計関数にはsum
、mean
、count
、max
、min
などがあります。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
することができます。sum
やmean
のような集計関数は非数値データには適用できませんが、カテゴリごとの出現回数を数えるなど、非数値データに対して意味のある関数を適用することはたくさんあります。
## 非数値データの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
は頼りになる相棒であることがわかるでしょう。その柔軟性とパワーにより、プログラミングや統計のバックグラウンドを持っていない人でもデータを扱い、探索的な分析を行うことができます。さあ、様々な機能を試して、データが貴重な洞察をもたらす様子を見守りましょう!
よくある質問
groupby
とピボットの違いは何ですか?
Pandasのgroupby
はカテゴリに基づいてデータを要約するために使用され、ピボットテーブルはデータを多次元の分析を提供するために二次元のテーブルに再形成するために使用されます。
- Pandasで非数値データを
groupby
できますか?
はい、Pandasでは非数値データをgroupby
できます。sum
やmean
などの集計関数は非数値データには適用できませんが、各カテゴリの出現回数をカウントするなど、他の操作はたくさんあります。
- PySparkで
groupby
を使うにはどうすればいいですか?
PySparkでは、groupby
の概念はPandasと同様です。グループ化後、各グループに対して集計関数を適用するためにagg
関数を使用する必要があります。