Pandas DataFrameの行・列を自在に並べ替え!reindex徹底活用ガイド


 

Pandas DataFrameを操作していると、「特定の順番で行や列を並べ替えたい」「一部の行や列だけを抽出して新しいDataFrameを作りたい」といったニーズが出てくることがあります。そんな時に非常に便利なのが**reindex**メソッドです。

reindexは、DataFrameやSeriesのインデックス(行ラベル)やカラム(列ラベル)を、指定した新しい順序に合わせて再構築する強力な機能です。存在しないラベルが指定された場合は、自動的にNaN(欠損値)が挿入されます。

この記事では、reindexメソッドの基本的な使い方から、行や列の並べ替え、欠損値の補間まで、具体的なコード例を交えながら詳しく解説します。


 

reindexメソッドとは?

 

reindexは、既存のDataFrameやSeriesのインデックス(またはカラム)を、新しいインデックス(またはカラム)リストに合わせて調整するメソッドです。

この操作の主な目的は以下の通りです。

  1. 行や列の並べ替え: 既存の行や列を、指定した任意の順序で並べ替える。

  2. 行や列の追加・削除: 新しいインデックスラベルやカラムラベルを指定することで、データを追加したり、不要なラベルを削除したりできる。

  3. データのアライメント: 異なるインデックスを持つSeriesやDataFrameを結合する際に、インデックスを揃える。

  4. 欠損値の挿入: 新しいインデックスに既存のデータがない場合、その場所にNaNを自動的に挿入する。


 

reindexメソッドの基本的な使い方

 

まずは、簡単なDataFrameを使ってreindexの動作を見てみましょう。

Python
 
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)

 

行の並べ替えと一部抽出

 

reindexindex引数に行ラベルのリストを指定することで、行を並べ替えたり、必要な行だけを抽出したりできます。

Python
 
# 行を任意の順序で並べ替える
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で埋められます。

Python
 
# 存在しない行ラベルを追加 (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引数に列ラベルのリストを指定することで、列を並べ替えたり、必要な列だけを抽出したりできます。

Python
 
# 列を任意の順序で並べ替える
new_col_order = ['C', 'A', 'B']
df_reindexed_cols = df.reindex(columns=new_col_order)

print("\n列を並べ替えたDataFrame:\n", df_reindexed_cols)

列の場合も、存在しない列ラベルを指定するとNaNが挿入されます。

Python
 
# 存在しない列ラベルを追加 (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_valuemethod引数を使うことで、欠損値の補間方法を指定できます。

 

fill_value引数: 特定の値で欠損値を埋める

 

fill_value引数を使用すると、新しく挿入されたNaNを指定した値で埋めることができます。

Python
 
# 存在しない行を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': 最も近いインデックスの値で補間

Python
 
# 時系列データの例
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は、インデックスが揃っていない複数のデータセットを結合する前処理として非常に役立ちます。

Python
 
# 異なるインデックスを持つ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が使えます。

Python
 
# 不連続な時系列データ
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を試してみてください。