この短いガイドでは、Pandas を使用して Python でピボット テーブル (pivot table)を作成する方法を説明します。

4 四半期にわたる売上に関するデータを含む次の DataFrame があるとします。

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan', 
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

print(df)

上記のコードを Python で実行すると、次の DataFrame が得られます。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 1

Pandasを使ったPythonのピボットテーブルの5つのシナリオ

シナリオ1: 一人当たり総売上

aggfunc=’sum’ を使用して、一人当たりの合計売上(4四半期全体)を取得するには、次のようにします。

pivot = df.pivot_table(index=['person'], values=['sales'], aggfunc='sum')

完全なコード:

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan',
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

pivot = df.pivot_table(index=['person'], values=['sales'], aggfunc='sum')

print(pivot)

一人当たりの合計売上は以下のとおりです。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 2

シナリオ2: 国別の総売上高

郡ごとに総売上高をグループ化するには(ここでは、「person」フィールドではなく「country」フィールドで結果を集計します):

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan',
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

pivot = df.pivot_table(index=['country'], values=['sales'], aggfunc='sum')

print(pivot)

すると、「country」別の総売上高が表示されます。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 3

シナリオ3: 個人と国の両方による売上

「person」フィールドや「country」フィールドなど、複数のフィールドで結果を集計することもできます。

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan',
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

pivot = df.pivot_table(index=['person', 'country'], values=['sales'], aggfunc='sum')

print(pivot)

コードを実行すると、「person」と「country」の両方の売上が表示されます。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 4

シナリオ4: 国別の最大個別販売

これまで、結果をグループ化するために合計演算 (つまり、aggfunc=’sum’) を使用してきましたが、その演算に限定されるわけではありません。

このシナリオでは、aggfunc=’max’ を使用して郡別の最大個別売上を見つけます。

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan',
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

pivot = df.pivot_table(index=['country'], values=['sales'], aggfunc='max')

print(pivot)

そして結果は次の通りです。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 5

シナリオ5: 国別の売上高の中央値、平均値、最小値

aggfunc 引数では複数の演算を使用できます。例えば、国別の売上高の中央値、平均値、最小値を求めるには、次のようにします。

aggfunc=['median', 'mean', 'min']

完全な Python コードは次のとおりです。

import pandas as pd

data = {'person': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'D', 'E'],
        'sales': [1000, 300, 400, 500, 800, 1000, 500, 700, 50, 60, 1000, 900, 750, 200, 300, 1000, 900, 250, 750, 50],
        'quarter': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4],
        'country': ['US', 'Japan', 'Brazil', 'UK', 'US', 'Brazil', 'Japan', 'Brazil', 'US', 'US', 'US', 'Japan',
                    'Brazil', 'UK', 'Brazil', 'Japan', 'Japan', 'Brazil', 'UK', 'US']
        }

df = pd.DataFrame(data)

pivot = df.pivot_table(index=['country'], values=['sales'], aggfunc='max')

print(pivot)

すると、次の結果が得られます。

Pandasを使ったPythonのピボットテーブルの5つのシナリオ 6

5つのシンプルなシナリオでピボットテーブルを作成する方法をご覧いただきました。しかし、ここで紹介した概念は、さまざまなシナリオに適用できます。