Pandasでデータ分析を自由自在!Index操作の魔法ツール「reindex」を徹底解説


reindex は、まるで錬金術師のように、既存の Index を新たな形へと変貌させます。具体的には、以下の操作が可能になります。

新しい Index に基づいてデータを取り出す

例えば、日付データの Index を月単位に再構築し、各月の売上データを取得したい場合に役立ちます。

import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'],
        '売上': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# 月ごとの売上を取得
df_reindexed = df.set_index('日付').reindex(pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01']))
print(df_reindexed)

欠損値を補完する

魔法の杖を振るえば、Index に存在しないデータにも値を割り当てることができます。

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
        '売上': [100, 200, 300]}
df = pd.DataFrame(data)

# 欠損値を補完
df_reindexed = df.set_index('日付').reindex(pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']), fill_value=0)
print(df_reindexed)

データの並び替え

Index を並び替えることで、データの整理整頓も可能です。

# データの準備
data = {'日付': ['2023-03-01', '2023-01-01', '2023-02-01'],
        '売上': [300, 100, 200]}
df = pd.DataFrame(data)

# 日付順に並び替え
df_reindexed = df.set_index('日付').reindex(df['日付'].sort_values())
print(df_reindexed)

複数レベルの Index を扱う

多次元データの Index も、reindex の魔法で自在に操ることができます。

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
        '地域': ['東京', '大阪', '名古屋'],
        '売上': [100, 200, 300]}
df = pd.DataFrame(data)

# 地域と日付で再構築
df_reindexed = df.set_index(['地域', '日付']).reindex([['東京', '大阪'], ['2023-01-01', '2023-02-01']])
print(df_reindexed)

条件に基づいてデータを取得

魔法の杖を振るい、条件に合致するデータのみを取り出すこともできます。

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
        '地域': ['東京', '大阪', '名古屋'],
        '売上': [100, 200, 300]}
df = pd.DataFrame(data)

# 2023年2月の売上を取得
df_reindexed = df.set_index(['地域', '日付']).reindex([(slice(None),


import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'],
        '売上': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# 月ごとの売上を取得
df_reindexed = df.set_index('日付').reindex(pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01']))
print(df_reindexed)

出力

          売上
日付
2023-01-01   100
2023-02-01   200
2023-03-01   300

欠損値を補完する

import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
        '売上': [100, 200, 300]}
df = pd.DataFrame(data)

# 欠損値を補完
df_reindexed = df.set_index('日付').reindex(pd.to_datetime(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01']), fill_value=0)
print(df_reindexed)

出力

          売上
日付
2023-01-01   100
2023-02-01   200
2023-03-01   300
2023-04-01     0

データの並び替え

import pandas as pd

# データの準備
data = {'日付': ['2023-03-01', '2023-01-01', '2023-02-01'],
        '売上': [300, 100, 200]}
df = pd.DataFrame(data)

# 日付順に並び替え
df_reindexed = df.set_index('日付').reindex(df['日付'].sort_values())
print(df_reindexed)

出力

          売上
日付
2023-01-01   100
2023-02-01   200
2023-03-01   300

複数レベルの Index を扱う

import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
        '地域': ['東京', '大阪', '名古屋'],
        '売上': [100, 200, 300]}
df = pd.DataFrame(data)

# 地域と日付で再構築
df_reindexed = df.set_index(['地域', '日付']).reindex([['東京', '大阪'], ['2023-01-01', '2023-02-01']])
print(df_reindexed)

出力

          売上
地域       日付
東京      2023-01-01    100
          2023-02-01    200
大阪      2023-01-01     NaN
          2023-02-01    200
名古屋    2023-01-01     NaN
          2023-02-01     NaN
import pandas as pd

# データの準備


.loc と .iloc

  • 例:
  • 欠点: 複雑な条件でのデータ取得には不向き
  • 利点: シンプルで直感的な操作
import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'],
        '売上': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# 特定の日付のデータを取得
df_loc = df.loc[pd.to_datetime(['2023-01-01', '2023-02-01'])]
print(df_loc)

# 特定の行インデックスのデータを取得
df_iloc = df.iloc[[0, 2]]
print(df_iloc)

.query

  • 例:
  • 欠点: 複雑なクエリにはパフォーマンスが低下する可能性がある
  • 利点: SQLライクな構文で条件指定が可能
import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'],
        '売上': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# 特定の日付のデータを取得
df_query = df.query("日付 >= '2023-02-01'")
print(df_query)

merge

  • 例:
  • 欠点: 単一データフレームの操作には不向き
  • 利点: 複数データフレームの結合に適している
import pandas as pd

# データの準備
df1 = pd.DataFrame({'日付': ['2023-01-01', '2023-02-01', '2023-03-01'],
                   '売上': [100, 200, 300]})
df2 = pd.DataFrame({'基準日': ['2023-02-15', '2023-03-31'],
                   '在庫': [50, 25]})

# 基準日に基づいて結合
df_merged = df1.merge(df2, left_on='日付', right_on='基準日', how='left')
print(df_merged)
  • 例:
  • 特定の値を含む行のみを取得する場合に有効
  • isinbetween
import pandas as pd

# データの準備
data = {'日付': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'],
        '売上': [100, 200, 300, 400]}
df = pd.DataFrame(data)

# 特定の日付を含む行のみを取得
df_isin = df[df['日付'].isin(pd.to_datetime(['2023-02-01', '2023-03-01']))]
print(df_isin)

# 特定の日付範囲の行のみを取得
df_between = df[(df['日付'] >= '2023-02-01') & (df['日付'] <= '2023-03-01')]
print(df_between)
  • 読みやすさ
  • 処理速度
  • データの構造と操作の複雑さ