Pandas DataFrameの行・列を自在に並べ替え!reindex徹底活用ガイド
Pandas DataFrameを操作していると、「特定の順番で行や列を並べ替えたい」「一部の行や列だけを抽出して新しいDataFrameを作りたい」といったニーズが出てくることがあります。そんな時に非常に便利なのが**reindex**メソッドです。
reindexは、DataFrameやSeriesのインデックス(行ラベル)やカラム(列ラベル)を、指定した新しい順序に合わせて再構築する強力な機能です。存在しないラベルが指定された場合は、自動的にNaN(欠損値)が挿入されます。
この記事では、reindexメソッドの基本的な使い方から、行や列の並べ替え、欠損値の補間まで、具体的なコード例を交えながら詳しく解説します。
reindexメソッドとは?
reindexは、既存のDataFrameやSeriesのインデックス(またはカラム)を、新しいインデックス(またはカラム)リストに合わせて調整するメソッドです。
この操作の主な目的は以下の通りです。
-
行や列の並べ替え: 既存の行や列を、指定した任意の順序で並べ替える。
-
行や列の追加・削除: 新しいインデックスラベルやカラムラベルを指定することで、データを追加したり、不要なラベルを削除したりできる。
-
データのアライメント: 異なるインデックスを持つSeriesやDataFrameを結合する際に、インデックスを揃える。
-
欠損値の挿入: 新しいインデックスに既存のデータがない場合、その場所に
NaNを自動的に挿入する。
reindexメソッドの基本的な使い方
まずは、簡単なDataFrameを使ってreindexの動作を見てみましょう。
import pandas as pd
import numpy as np
# サンプルDataFrameの作成
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data, index=['x', 'y', 'z'])
print("元のDataFrame:\n", df)
行の並べ替えと一部抽出
reindexのindex引数に行ラベルのリストを指定することで、行を並べ替えたり、必要な行だけを抽出したりできます。
# 行を任意の順序で並べ替える
new_row_order = ['z', 'x', 'y']
df_reindexed_rows = df.reindex(index=new_row_order)
print("\n行を並べ替えたDataFrame:\n", df_reindexed_rows)
指定したインデックスに'a'のように元のDataFrameに存在しないラベルが含まれる場合、その行はNaNで埋められます。
# 存在しない行ラベルを追加 (NaNが挿入される)
new_row_with_missing = ['x', 'a', 'z']
df_reindexed_missing_row = df.reindex(index=new_row_with_missing)
print("\n存在しない行を追加したDataFrame:\n", df_reindexed_missing_row)
列の並べ替えと一部抽出
columns引数に列ラベルのリストを指定することで、列を並べ替えたり、必要な列だけを抽出したりできます。
# 列を任意の順序で並べ替える
new_col_order = ['C', 'A', 'B']
df_reindexed_cols = df.reindex(columns=new_col_order)
print("\n列を並べ替えたDataFrame:\n", df_reindexed_cols)
列の場合も、存在しない列ラベルを指定するとNaNが挿入されます。
# 存在しない列ラベルを追加 (NaNが挿入される)
new_col_with_missing = ['A', 'D', 'C']
df_reindexed_missing_col = df.reindex(columns=new_col_with_missing)
print("\n存在しない列を追加したDataFrame:\n", df_reindexed_missing_col)
欠損値(NaN)の補間戦略
reindexによって挿入されたNaNをどのように扱うかは重要です。fill_valueやmethod引数を使うことで、欠損値の補間方法を指定できます。
fill_value引数: 特定の値で欠損値を埋める
fill_value引数を使用すると、新しく挿入されたNaNを指定した値で埋めることができます。
# 存在しない行を0で埋める
new_row_with_fill_value = ['x', 'a', 'z']
df_reindexed_fill_0 = df.reindex(index=new_row_with_fill_value, fill_value=0)
print("\n存在しない行を0で埋めたDataFrame:\n", df_reindexed_fill_0)
method引数: 前方・後方補間
特に時系列データにおいて、NaNを前後の有効な値で補間したい場合があります。method引数には以下のオプションがあります。
-
'ffill'(forward fill): 前の有効な値で補間 -
'bfill'(backward fill): 後ろの有効な値で補間 -
'pad':ffillと同じ -
'backfill':bfillと同じ -
'nearest': 最も近いインデックスの値で補間
# 時系列データの例
ts = pd.Series([10, np.nan, 12, np.nan, 15],
index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-05', '2024-01-07', '2024-01-09']))
print("元の時系列Series:\n", ts)
# 日次データにリインデックスしてffillで補間
daily_index = pd.date_range('2024-01-01', '2024-01-09', freq='D')
ts_reindexed_ffill = ts.reindex(daily_index, method='ffill')
print("\n日次でreindexしffillで補間したSeries:\n", ts_reindexed_ffill)
reindexの応用例
異なるインデックスを持つSeries/DataFrameの結合
reindexは、インデックスが揃っていない複数のデータセットを結合する前処理として非常に役立ちます。
# 異なるインデックスを持つSeries
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20], index=['a', 'd'])
# s1のインデックスに合わせてs2をreindex
s2_reindexed = s2.reindex(s1.index)
print("\ns1のインデックスに合わせてreindexしたs2:\n", s2_reindexed)
# 結合
combined = pd.DataFrame({'s1': s1, 's2': s2_reindexed})
print("\n結合結果:\n", combined)
データの欠損期間の作成
時系列データで、特定の期間のデータが欠損していることを明示的に示したい場合にもreindexが使えます。
# 不連続な時系列データ
sparse_ts = pd.Series([10, 20, 30],
index=pd.to_datetime(['2024-01-01', '2024-01-05', '2024-01-10']))
# 連続した日次インデックスでreindexし、欠損期間をNaNで表現
full_date_range = pd.date_range('2024-01-01', '2024-01-10', freq='D')
full_ts = sparse_ts.reindex(full_date_range)
print("\n連続した日付でreindexしたSeries:\n", full_ts)
まとめ
Pandasの**reindex**メソッドは、DataFrameやSeriesの行・列を自在に並べ替え、選択、追加するための強力で柔軟なツールです。
-
df.reindex(index=new_index): 行をnew_indexの順に並べ替える/抽出する。 -
df.reindex(columns=new_columns): 列をnew_columnsの順に並べ替える/抽出する。 -
fill_value: 新しく生じた欠損値を特定の値で埋める。 -
method: 時系列データなどで、前方・後方補間によって欠損値を埋める。
reindexを使いこなすことで、データの前処理、結合、整形が格段に効率的になり、より複雑なデータ分析の基盤を構築できるようになるでしょう。ぜひ、ご自身のデータでreindexを試してみてください。

