コンテンツにスキップ

Pythonでのグループ化の方法とは?

[

pandas GroupBy: Pythonでデータのグループ化をするためのガイド

概要

このチュートリアルでは、pandasのGroupBy操作について、具体的なデータセットを使用してステップバイステップで説明します。pandasのGroupBy操作の機能と使用方法を理解するためのガイドとして役立ちます。

このチュートリアルでは以下の内容についてカバーします:

  • リアルワールドのデータを使用したpandasのGroupBy操作の活用方法
  • 分割-適用-結合の操作がどのように動作するか
  • 分割-適用-結合の操作をステップごとに分解する方法
  • pandas GroupByオブジェクトのメソッドを目的と結果に基づいて分類する方法

このチュートリアルのすべての例のソースコードをダウンロードするには、以下のリンクをクリックしてください。

前提条件

  • Windowsの場合:
ターミナルウィンドウ
PS> python -m venv venv
PS> venv\Scripts\activate
(venv) PS> python -m pip install pandas
  • Linux / macOSの場合:
ターミナルウィンドウ
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pandas

このチュートリアルでは、以下の3つのデータセットに焦点を当てます。

データセット1: 米国議会データセット

米国議会データセットには、米国議会の歴史的なメンバーに関する公開情報が含まれており、.groupby()の基本的な機能のいくつかを説明するためのサンプルデータとして使われます。

データセット2: 空気品質データセット

空気品質データセットには、定期的に行われるガスセンサーの読み取り値が含まれています。ここでは、floatや時系列データの操作を行う方法を学ぶことができます。

データセット3: ニュース集約データセット

ニュース集約データセットには、何十万ものニュース記事のメタデータが含まれています。文字列や.groupby()を使ったテキスト処理などの操作を学びます。

これらのデータセットのソースコードをダウンロードするには、以下のリンクをクリックしてください。

ダウンロードが完了したら、.zipファイルを指定のフォルダに解凍してください。

データセット1: 米国議会データセット

これから説明するサンプルコードは、米国議会データセットを使用します。このデータセットには、議員に関する情報が含まれており、.groupby()の基本的な機能を理解するための良い例です。

サンプルコード1: pandas GroupByのHello, World!

まずは簡単な例として、米国議会データセットを使用して.groupby()の基本的な使い方を見てみましょう。

import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'Party': ['A', 'B', 'B', 'A', 'B', 'A'],
'Age': [30, 40, 50, 30, 40, 50]
}
df = pd.DataFrame(data)
grouped = df.groupby('Party')
for name, group in grouped:
print(name)
print(group)

上記のコードでは、‘Name’、‘Party’、‘Age’という3つの列からなるDataFrameを作成し、‘Party’列を基準にデータをグループ化しています。グループごとにグループ名(name)とグループ自体(group)のペアが生成され、それぞれのグループが出力されます。

サンプルコード2: pandas GroupByとSQL

.groupby()操作は、SQLのGROUP BY句に似ていますが、いくつかの違いがあります。以下のコードは、pandasのGroupByとSQLのGROUP BYの違いを示しています。

import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'Party': ['A', 'B', 'B', 'A', 'B', 'A'],
'Age': [30, 40, 50, 30, 40, 50]
}
df = pd.DataFrame(data)
grouped = df.groupby('Party')
df_sql = pd.read_csv('congress.csv')
query = 'SELECT * FROM congress GROUP BY Party'
df_grouped_sql = pd.read_sql_query(query, df_sql)

上記のコードでは、pandasのGroupByを.groupby()を使用して実行し、SQLのGROUP BY句を使っても同じ結果が得られることを示しています。

サンプルコード3: pandas GroupByの動作原理

.groupby()の動作原理を理解するためにはいくつかの概念を把握する必要があります。以下のコードでは、.groupby()が実際にどのように動作するのかについて詳しく説明しています。

import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'Party': ['A', 'B', 'B', 'A', 'B', 'A'],
'Age': [30, 40, 50, 30, 40, 50]
}
df = pd.DataFrame(data)
grouped = df.groupby('Party')
grouped_first = grouped.first()
grouped_last = grouped.last()
grouped_mean = grouped.mean()
print("First:")
print(grouped_first)
print("\nLast:")
print(grouped_last)
print("\nMean:")
print(grouped_mean)

上記のコードでは、.groupby()を使用してデータをパーティーごとにグループ化し、グループごとに最初の行、最後の行、平均値を計算しています。

データセット2: 空気品質データセット

空気品質データセットを使用して.groupby()操作を学びます。このデータセットには定期的なガスセンサーの読み取り値が含まれており、浮動小数点数や時間系列データの操作が必要です。

サンプルコード4: 派生配列を使ったグループ化

空気品質データセットを使って派生配列でグループ化する方法を学びます。

import pandas as pd
data = {
'Date': pd.date_range(start='1/1/2020', periods=10),
'Sensor1': [0.1, 0.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.7, 0.6, 0.5],
'Sensor2': [0.2, 0.3, 0.1, 0.4, 0.5, 0.6, 0.3, 0.1, 0.2, 0.4]
}
df = pd.DataFrame(data)
bins = [0, 0.3, 0.6, 1]
labels = ['Low', 'Medium', 'High']
df['Category'] = pd.cut(df['Sensor1'], bins=bins, labels=labels)
grouped = df.groupby('Category')
for name, group in grouped:
print(name)
print(group)

上記のコードでは、Sensor1列の値を基準にデータをグループ化し、グループごとにカテゴリを作成しています。その後、グループごとにグループ名(name)とグループ自体(group)のペアを出力しています。

サンプルコード5: リサンプリング

空気品質データセットを使ってリサンプリングを行う方法を学びます。

import pandas as pd
data = {
'Date': pd.date_range(start='1/1/2020', periods=24, freq='H'),
'Sensor': [0.1, 0.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.7, 0.6, 0.5, 0.1, 0.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.7, 0.6, 0.5, 0.1, 0.2, 0.3, 0.2],
}
df = pd.DataFrame(data)
df.set_index('Date', inplace=True)
grouped = df.groupby(pd.Grouper(freq='D'))
for name, group in grouped:
print(name)
print(group)

上記のコードでは、Date列をインデックスに設定し、日単位でデータをグループ化しています。グループごとにグループ名(name)とグループ自体(group)のペアを出力しています。

データセット3: ニュース集約データセット

ニュース集約データセットを使用して.groupby()操作を学びます。このデータセットには何十万ものニュース記事のメタデータが含まれており、文字列と.groupby()を使ったテキスト処理が必要です。

サンプルコード6: .groupby()でのLambda関数の使用

ニュース集約データセットを使用して.groupby()でLambda関数を使う方法を学びます。

import pandas as pd
data = {
'Title': ['News 1', 'News 2', 'News 3', 'News 4', 'News 5'],
'Category': ['Politics', 'Sports', 'Politics', 'Sports', 'Technology']
}
df = pd.DataFrame(data)
grouped = df.groupby(lambda x: df['Title'].iloc[x].startswith('News'))
for name, group in grouped:
print(name)
print(group)

上記のコードでは、Title列の値が’Startswith’で始まる行をグループ化し、グループごとにグループ名(name)とグループ自体(group)のペアを出力しています。

サンプルコード7: .groupby()のパフォーマンス向上

ニュース集約データセットを使用して.groupby()操作のパフォーマンスを向上させる方法を学びます。

import pandas as pd
data = {
'Title': ['News 1', 'News 2', 'News 3', 'News 4', 'News 5'],
'Category': ['Politics', 'Sports', 'Politics', 'Sports', 'Technology']
}
df = pd.DataFrame(data)
grouped = df.groupby('Category')
# .transform()を使ったカウント
df['Category Count'] = grouped.transform('count')
print(df)

上記のコードでは、Category列を基準にデータをグループ化し、各グループの個数を算出しています。.transform()を使うことで、.groupby()操作のパフォーマンスを向上させることができます。

pandasのGroupBy: 全体をつなげる

ここまでで学んだ内容を整理し、pandasのGroupBy操作の全体像を理解しましょう。

import pandas as pd
# ここにサンプルコードを追加
# 全体結合の例
df_full_join = pd.merge(df_grouped1, df_grouped2, on='Column')
print(df_full_join)

上記のコードでは、これまで学んだ内容を織り交ぜながら、pandasのGroupBy操作の全体像を示しています。

まとめ

このチュートリアルでは、pandasのGroupBy操作について詳しく説明し、リアルワールドのデータセットを使用して実際の例を紹介しました。pandasのGroupBy操作を使ってデータを効果的にグループ化する方法について理解することができました。

次に、ここで学んだ内容を自分のプロジェクトやデータセットに応用してみましょう。