Traffine I/O

日本語

2022-11-12

Pandasによるデータの集計とグループ化

はじめに

Pandasは、データ操作や分析に柔軟に対応するためのPythonライブラリです。SeriesやDataFrameなどのデータ構造を提供しており、構造化されたデータの操作が容易になっています。Pandasのもっとも便利な機能の1つは、データを効率的に集計やグループ化できることで、グループ化されたデータに対してさまざまな操作を実行することができます。この記事では、Pandasを使ったデータの集計とグループ化の手順について説明します。

GroupByオブジェクト

PandasのGroupByオブジェクトを使うと、1つ以上の列でデータを効率的にグループ化し、グループ化されたデータに対してさまざまな操作を行うことができます。この章では、GroupByオブジェクトの作成、列や行の選択、グループごとの反復について説明します。

GroupByオブジェクトの作成

GroupByオブジェクトを作成するには、グループ化するデータを持つDataFrameが必要です。この例では、Category列とValue列を持つDataFrameを用意しています。

python
import pandas as pd

data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Value': [10, 20, 30, 40, 50, 60]}

df = pd.DataFrame(data)

GroupByオブジェクトを作成するには、DataFrameの.groupby()メソッドを使用して、グループ化する列名を渡します。

python
grouped = df.groupby('Category')

grouped変数には、Category列でグループ化されたデータを含むGroupByオブジェクトが格納されます。

列と行の選択

GroupByオブジェクトを作成したら、.get_group()メソッドを使用して特定のグループを選択できます。例えば、カテゴリがAのグループを選択するには、次のようにします。

python
grouped.get_group('A')
  Category  Value
0        A     10
2        A     30
4        A     50

これにより、カテゴリがAの行だけを含むDataFrameが返されます。

グループごとの反復

forループを使ってGroupByオブジェクト内のグループを反復処理することもできます。ループは、グループ名と対応するグループのDataFrameの両方をyieldします。

python
for name, group in grouped:
    print(name)
    print(group)
A
  Category  Value
0        A     10
2        A     30
4        A     50

B
  Category  Value
1        B     20
3        B     40
5        B     60

この例では、ループはグループ名(AまたはB)と、そのカテゴリに属する行を含むDataFrameを印字します。これは、各グループごとに個別の分析を実行するか、グループを個別のファイルに保存するために役立ちます。

集計関数

集計関数を使うと、グループ化されたデータに対して計算を行うことができます。例えば、各グループ内の値の合計、平均、数を見つけるなどが挙げられます。この章では、組み込みの集計関数、カスタムの集計関数の作成、複数の集計関数を一度に適用する方法について説明します。

組み込みの集計関数

Pandasは、GroupByオブジェクトに直接適用できるいくつかの組み込み集計関数を提供しています。代表的な集計関数には以下があります。

  • .sum(): 各グループ内の値の合計を計算
  • .mean(): 各グループ内の値の平均を計算
  • .count(): 各グループ内の値の数を数える

例えば、Value列の合計を計算するには、.sum()メソッドを使用できます。

python
grouped.sum()
          Value
Category
A            90
B           120

これにより、各カテゴリごとのValue列の合計を含むDataFrameが返されます。

カスタムの集計関数

組み込みの集計関数が要件を満たさない場合は、独自のカスタム集計関数を作成することができます。これを行うには、入力としてSeriesまたはDataFrameを取り、単一の値を返す関数を定義します。次に、.aggregate()または.agg()メソッドを使用して、GroupByオブジェクトにカスタム関数を適用します。

例えば、各グループ内の値の合計をその値の数で割ったものを計算するには、次のようにカスタム集計関数を作成できます。

python
def custom_agg(x):
    return x.sum() / x.count()

grouped.aggregate(custom_agg)
          Value
Category
A            30
B            40

これにより、各グループにカスタム集計関数を適用した結果を示すDataFrameが返されます。

複数の集計関数を適用

複数の集計関数を一度にGroupByオブジェクトに適用するには、.agg()メソッドに関数のリストを渡します。その結果、元の列名を表す上位レベルと、適用された集計関数を表す下位レベルを持つ階層的な列構造のDataFrameが返されます。

例えば、各グループ内のValue列の合計、平均、数を計算するには、次のようにします。

python
grouped.agg(['sum', 'mean', 'count'])
          Value
            sum mean count
Category
A            90   30     3
B           120   40     3

これにより、各グループに指定された集計関数を適用した結果が含まれるDataFrameが返されます。

ピボットテーブル

ピボットテーブルは、指定された列に基づいてデータを再形成および集計することで、データを要約する方法を提供します。この章では、ピボットテーブルの作成、ピボットテーブル値のカスタマイズ、欠損データの処理について説明します。

ピボットテーブルの作成

ピボットテーブルを作成するには、pd.pivot_table()関数を使用します。この関数には、次の引数があります。

  • data: ピボットするDataFrame
  • values: 集計するデータが含まれる列
  • index: ピボットテーブル内の行ラベルとして使用する列
  • columns:(オプション)ピボットテーブル内の列ラベルとして使用する列
  • aggfunc: 適用する集計関数

例えば、カテゴリごとのValue列の合計を示すピボットテーブルを作成するには、次のようにします。

python
pivot = pd.pivot_table(df, values='Value', index='Category', aggfunc='sum')
          Value
Category
A            90
B           120

これにより、カテゴリごとのValue列の合計を示すピボットテーブルが返されます。

ピボットテーブル値のカスタマイズ

ピボットテーブルの値をカスタマイズするには、異なる集計関数を指定するか、複数の列または関数を含めることができます。これを行うには、valuesindexcolumns、またはaggfunc引数に列名または関数のリストを渡します。

例えば、カテゴリごとのValue列の合計と平均を両方表示するピボットテーブルを作成するには、次のようにします。

python
pd.pivot_table(df, values='Value', index='Category', aggfunc=['sum', 'mean'])
          sum mean
        Value Value
Category
A          90    30
B         120    40

これにより、上位レベルが適用された集計関数を表し、下位レベルが元の列名を表す階層的な列構造のDataFrameが返されます。

欠損データの処理

ピボットテーブルは、カテゴリカルデータを扱う場合に特に、欠損データを含むセルを生成する場合があります。ピボットテーブルの欠損データを処理するには、fill_value引数を使用して、欠損データを置換するデフォルト値を指定できます。

例えば、対応する値がない追加のカテゴリCを持つDataFrameがあるとします。

python
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B', 'C'],
        'Value': [10, 20, 30, 40, 50, 60, None]}

df = pd.DataFrame(data)

デフォルトでは、ピボットテーブルでは欠損データに対してNaNの値が表示されます。

python
pd.pivot_table(df, values='Value', index='Category', aggfunc='sum')
          Value
Category
A           90.0
B          120.0
C            NaN

欠損データを指定されたデフォルト値に置き換えるには、fill_value引数を使用します。

python
pd.pivot_table(df, values='Value', index='Category', aggfunc='sum', fill_value=0)
          Value
Category
A            90
B           120
C             0

これにより、指定されたデフォルト値に欠損データが置き換えられた、各カテゴリのValue列の合計を示すピボットテーブルが返されます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!