Pandas df.pivot() 関数
df.pivot()DataFrame のメンバーメソッドであり、ピボットテーブルの作成に使用されます。。指定された行インデックス、列インデックス、値の列に基づいて、データを新しいレイアウト形式に再形成できます。
とpivot_table()とは異なり、pivot()集計操作をサポートしておらず、行インデックスと列インデックスの組み合わせが一意であることが必要です。そうでない場合はエラーが発生します。
単語の意味: pivot「回転」「ピボット」という意味で、ここではデータの「回転」による再形成を指し、Pivotテーブルのように行と列の次元を動的に切り替えることができます。
基本構文とパラメータ
df.pivot()DataFrame のインスタンスメソッドであり、ドット演算子で呼び出します。
構文形式
DataFrame.pivot(index=None, columns, values=None)
パラメータの説明
- パラメータ:
index- 型:列名、ラベル、ラベルリスト、または None。
- 説明:新しい DataFrame の行インデックスとして使用する列。None の場合は、既存の行インデックスが使用されます。
- パラメータ:
columns- 型:列名またはラベル。
- 説明:必須パラメータ。新しい DataFrame の列インデックスとして使用する列で、一意の値を列名に展開するために使用します。
- パラメータ:
values- 型:列名、ラベル、ラベルリスト、または None。
- 説明:DataFrame を埋めるためのデータ列。指定しない場合は、index と columns 以外のすべての列が使用されます。
関数の説明
- 戻り値:新しい DataFrame(ピボットテーブル)を返します。
- 制限:index と columns の組み合わせに重複する値が存在する場合、ValueError がスローされます。この場合は
pivot_table()を使用すると、自動的に集計が行われます。
実例
簡単なものから複雑なものまで一連の例を通して、df.pivot()の使い方を完全にマスターしましょう。
例1:基本用法 - シンプルなピボットテーブルの作成
実例
import pandas as pd
# 1. 売上データを作成(各行が商品-地域-売上額の組み合わせ)
sales = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'C', 'C'],
'region': ['North', 'South', 'North', 'South', 'North', 'South'],
'sales': [100, 150, 200, 180, 220, 250]
})
print("=== 元の売上データ ===")
print(sales)
# 2. df.pivot() を使用してピボットテーブルを作成
# 行インデックス:product、列インデックス:region、値:sales
pivot_result = sales.pivot(index='product', columns='region', values='sales')
print("n=== df.pivot() ピボットテーブル ===")
print(pivot_result)
# 1. 売上データを作成(各行が商品-地域-売上額の組み合わせ)
sales = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'C', 'C'],
'region': ['North', 'South', 'North', 'South', 'North', 'South'],
'sales': [100, 150, 200, 180, 220, 250]
})
print("=== 元の売上データ ===")
print(sales)
# 2. df.pivot() を使用してピボットテーブルを作成
# 行インデックス:product、列インデックス:region、値:sales
pivot_result = sales.pivot(index='product', columns='region', values='sales')
print("n=== df.pivot() ピボットテーブル ===")
print(pivot_result)
実行結果の想定:
=== 原始销售数据 === product region sales 0 A North 100 1 A South 150 2 B North 200 3 B South 180 4 C North 220 5 C South 250 === df.pivot() 透视表 === region North South product A 100 150 B 200 180 C 220 250
コードの解説:
- 元データはロング形式であり、各行に1つの商品の特定地域での売上額が記録されています。
pivot()product 列を行インデックス、region 列を列インデックス、sales を値として使用します。- 結果は明確な2次元テーブルであり、異なる商品の異なる地域での販売状況を直感的に比較できます。
例2:複数列の値 - 複数の指標を同時にピボット
複数の数値列を同時にピボットして、より豊富なデータビューを得ることができます。
実例
import pandas as pd
# 1. 売上額と数量を含むデータを作成
sales = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'],
'region': ['North', 'South', 'North', 'South', 'East', 'West', 'East', 'West'],
'sales': [100, 150, 200, 180, 120, 130, 190, 210],
'quantity': [10, 15, 20, 18, 12, 13, 19, 21]
})
print("=== 元のデータ ===")
print(sales)
# 2. 売上額のみをピボット
print("n=== 売上額ピボットテーブル ===")
sales_pivot = sales.pivot(index='product', columns='region', values='sales')
print(sales_pivot)
# 3. 売上額と数量をピボット(valuesを指定せず、すべての数値列を使用)
print("n=== 複数指標ピボット ===")
multi_pivot = sales.pivot(index='product', columns='region')
print(multi_pivot)
# 1. 売上額と数量を含むデータを作成
sales = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'],
'region': ['North', 'South', 'North', 'South', 'East', 'West', 'East', 'West'],
'sales': [100, 150, 200, 180, 120, 130, 190, 210],
'quantity': [10, 15, 20, 18, 12, 13, 19, 21]
})
print("=== 元のデータ ===")
print(sales)
# 2. 売上額のみをピボット
print("n=== 売上額ピボットテーブル ===")
sales_pivot = sales.pivot(index='product', columns='region', values='sales')
print(sales_pivot)
# 3. 売上額と数量をピボット(valuesを指定せず、すべての数値列を使用)
print("n=== 複数指標ピボット ===")
multi_pivot = sales.pivot(index='product', columns='region')
print(multi_pivot)
実行結果の想定:
=== 原始数据 ===
product region sales quantity
0 A North 100 10
1 A South 150 15
2 B North 200 20
3 B South 180 18
4 A East 120 12
5 A West 130 13
6 B East 190 19
7 B West 210 21
=== 销售额透视表 ===
region East North South West
product
A 120 100 150 130
B 190 200 180 210
=== 多指标透视 ===
sales quantity
region East North South West East North South West
product
A 120 100 150 130 12 10 15 13
B 190 200 180 210 19 20 18 21
コードの解説:
- パラメータを指定しない場合、
valuesindex と columns 以外のすべての列が使用されます。 - 複数列のピボットでは複数層の列インデックスが生成され、1層目は元の列名、2層目は columns パラメータの値になります。
- この方法により、複数の指標の異なる次元でのパフォーマンスを同時に比較しやすくなります。
例3:複数層インデックス - 複数の列を行インデックスとして使用
複数の列を使用して、階層化インデックスを持つピボットテーブルを作成できます。
実例
import pandas as pd
# 1. 年、四半期、商品情報を含むデータを作成
data = pd.DataFrame({
'year': [2023, 2023, 2023, 2023, 2024, 2024, 2024, 2024],
'quarter': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q1', 'Q2', 'Q2'],
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 200, 180, 220, 250, 230, 270]
})
print("=== 元のデータ ===")
print(data)
# 2. 複数の列を行インデックスとして使用(リスト形式)
print("n=== 複数層行インデックスピボット ===")
pivot_multi = data.pivot(index=['year', 'quarter'], columns='product', values='sales')
print(pivot_multi)
# 3. インデックスをリセットして、通常のDataFrameに変換
print("n=== インデックスリセット後 ===")
pivot_reset = pivot_multi.reset_index()
print(pivot_reset)
# 1. 年、四半期、商品情報を含むデータを作成
data = pd.DataFrame({
'year': [2023, 2023, 2023, 2023, 2024, 2024, 2024, 2024],
'quarter': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q1', 'Q2', 'Q2'],
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 200, 180, 220, 250, 230, 270]
})
print("=== 元のデータ ===")
print(data)
# 2. 複数の列を行インデックスとして使用(リスト形式)
print("n=== 複数層行インデックスピボット ===")
pivot_multi = data.pivot(index=['year', 'quarter'], columns='product', values='sales')
print(pivot_multi)
# 3. インデックスをリセットして、通常のDataFrameに変換
print("n=== インデックスリセット後 ===")
pivot_reset = pivot_multi.reset_index()
print(pivot_reset)
実行結果の想定:
=== 原始数据 === year quarter product sales 0 2023 Q1 A 100 1 2023 Q1 B 150 值会抛出错误 - 这是 pivot() 和 pivot_table() 的关键区别:pivot() 要求数据唯一性,pivot_table() 会自动聚合重复值
コードの解説:
- を使用することで
index=['year', 'quarter']複数層の行インデックスを持つピボットテーブルを作成できます。 - この形式により、時間の次元で異なる商品のパフォーマンスを分析しやすくなります。
- を使用すると、
reset_index()階層化インデックスを通常の列に戻すことができます。
その他の拡張注意:元のデータに同じ index + columns の組み合わせが存在する場合、
pivot()ValueError がスローされValueError: Index contains duplicate entriesます。この場合はpivot_table()を使用すると、重複する値を自動的に集計します。
Pandas よく使う関数