【Python】Pandasデータフレームのマルチレベル列インデックスからレベルを削除する方法
マルチレベル列インデックスからレベルを削除する方法
Pandasのマルチレベル(階層型)列インデックスから特定のレベルを取り除くには、columns.droplevel()メソッドを使用します。引数に削除したいレベルの位置(0始まりの整数)やレベル名を渡すだけで、指定した階層を簡単に除去できます。なお、マルチインデックス自体はMultiIndex.from_tuples()を使うことで、タプルのリストから列方向に作成できます。
以下では、実際の手順に沿って、列インデックスのレベルを削除する流れを解説します。
ステップ1:列方向にマルチインデックスを作成する
まず、MultiIndex.from_tuples()で列用のインデックスを生成します。
items = pd.MultiIndex.from_tuples([('Col 1', 'Col 1', 'Col 1'), ('Col 2', 'Col 2', 'Col 2'), ('Col 3', 'Col 3', 'Col 3')])
ステップ2:マルチインデックス配列を作成し、データフレームを形成する
続いて、行側のマルチインデックスとなる配列を用意し、それをインデックスとして持つデータフレームを作成します。
arr = [
np.array(['car', 'car', 'car', 'bike', 'bike', 'bike', 'truck', 'truck', 'truck']),
np.array(['valueA', 'valueB', 'valueC', 'valueA', 'valueB', 'valueC', 'valueA', 'valueB', 'valueC'])
]
# マルチインデックスのデータフレームを生成
dataFrame = pd.DataFrame(np.random.randn(9, 3), index=arr, columns=items)
ステップ3:インデックスにラベルを付ける
各インデックスレベルに名前を付けておくと、データフレームの構造を把握しやすくなります。
dataFrame.index.names = ['level 0', 'level 1']
ステップ4:インデックス0のレベルを削除する
droplevel(0)を実行して最上位(0番目)のレベルを削除し、その結果を列に再代入します。
dataFrame.columns = dataFrame.columns.droplevel(0)
サンプルコード全体
ここまでの手順をまとめた完全なサンプルコードは以下の通りです。
import numpy as np
import pandas as pd
# 列方向のマルチインデックスを作成
items = pd.MultiIndex.from_tuples([('Col 1', 'Col 1', 'Col 1'), ('Col 2', 'Col 2', 'Col 2'), ('Col 3', 'Col 3', 'Col 3')])
# 行方向のマルチインデックス配列
arr = [
np.array(['car', 'car', 'car', 'bike', 'bike', 'bike', 'truck', 'truck', 'truck']),
np.array(['valueA', 'valueB', 'valueC', 'valueA', 'valueB', 'valueC', 'valueA', 'valueB', 'valueC'])
]
# マルチインデックスのデータフレームを生成
dataFrame = pd.DataFrame(np.random.randn(9, 3), index=arr, columns=items)
# インデックスにラベルを設定
dataFrame.index.names = ['level 0', 'level 1']
print("DataFrame...\n", dataFrame)
print("\nDropping a level...\n")
dataFrame.columns = dataFrame.columns.droplevel(0)
print("Updated DataFrame..\n", dataFrame)
実行結果
上記のコードを実行すると、次のような出力が得られます(乱数を使用しているため、数値は実行ごとに異なります)。
DataFrame...
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
level 0 level 1
car valueA 1.691127 0.315145 -0.695925
valueB -2.077182 -2.027643 -0.523965
valueC 1.021402 -0.384421 0.640215
bike valueA -2.271217 0.197185 0.304847
valueB 0.119615 -0.520491 -0.746547
valueC 1.856888 -0.491540 -1.754604
truck valueA 0.829854 -0.204102 -1.130511
valueB 0.310692 0.119087 -0.244919
valueC -0.245934 -2.141639 -1.298278
Dropping a level...
Updated DataFrame..
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
level 0 level 1
car valueA 1.691127 0.315145 -0.695925
valueB -2.077182 -2.027643 -0.523965
valueC 1.021402 -0.384421 0.640215
bike valueA -2.271217 0.197185 0.304847
valueB 0.119615 -0.520491 -0.746547
valueC 1.856888 -0.491540 -1.754604
truck valueA 0.829854 -0.204102 -1.130511
valueB 0.310692 0.119087 -0.244919
valueC -0.245934 -2.141639 -1.298278
補足:droplevel()を使う際のポイント
- 引数を省略した場合(
droplevel())は、第0レベルが自動的に削除されます。 droplevel([0, 1])のようにリストを渡すことで、複数のレベルを一度に削除することも可能です。- レベルに名前が設定されている場合は、位置ではなくレベル名を指定して削除できます。
-
Python Pandas入門:データフレームからマルチインデックスを作成する方法
Pandasのデータフレーム(DataFrame)からマルチインデックス(MultiIndex)を作成するには、MultiIndex.from_frame() メソッドを使用します。このメソッドを使うと、既存のデータフレームの列をそのまま階層的なインデックスへと変換でき、多次元データの扱いが格段に便利になります。マルチインデックス作成の基本手順1. リストからなる辞書を用意するまず、サンプルデータとして車種と購入日を持つ辞書を作成します。d = {Car: [BMW, Lexus, Audi, Mercedes, Jaguar, Bentley], Date_of_purchase:
-
【Python】Pandas DataFrameからnull(欠損値)行を削除する方法|dropna()の使い方
PandasのDataFrameからnull(NaN)行を削除するには、dropna()メソッドを使用します。この記事では、NaNを含むCSVファイルを読み込み、dropna()で欠損値を含む行を取り除くまでの手順を、サンプルコードと実行結果とともにわかりやすく解説します。前提:NaNを含むCSVファイル今回の例では、一部にNaN(null値)が含まれる以下のようなCSVファイル(CarRecords.csv)を使用します。手順1:read_csv()でCSVファイルを読み込むまずpandasをインポートし、read_csv()を使ってCSVファイルを読み込みます。ここではデスクトップ上に保存