インデックスの整列と再インデックス
reindex()で2つのDataFrameを共通のインデックスに揃え、欠損ラベルを補完し、算術演算でインデックスがどのように揃うかを理解します。
「インデックスの整列と再インデックス」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
Pandasがインデックスをそろえる仕組み
Pandasの最も強力で、ときには意外な動作の1つが自動インデックスアラインメントです。2つのSeriesまたはDataFrameを加算、減算、その他の方法で組み合わせると、Pandasはまず演算前にインデックスラベルを基準としてそろえます。一致するラベル同士で演算が行われ、一致しないラベルにはNaNが生成されます。これにより、データのずれによる見えにくいエラーを防ぎ、手動でソートや並べ替えをしなくても、異なるソースのデータを安全に組み合わせられます。
import pandas as pd
s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['b', 'c', 'd'])
# Alignment in action: a→NaN, d→NaN
result = s1 + s2
print('s1 + s2 with automatic alignment:')
print(result)インデックスの不一致によるNaN
インデックスラベルが一致しない場合、Pandasは不足している項目をNaNで埋めます。これは意図された動作であり、「オペランドの一方に対応する値がなかった」ことを示します。2つのSeriesまたはDataFrameの算術演算結果に予期しないNaN値がないか、必ず確認してください。NaN値があれば、インデックスがそろっていないサインです。算術メソッドでfill_value=0(s1.add(s2, fill_value=0)など)を使うと、そろえた値が欠けている場合にNaNを伝播させず、0として扱えます。
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Default: NaN where labels don't match
print('Default (NaN for unmatched):')
print(s1 + s2)
# fill_value=0: treat missing as zero
print('\nWith fill_value=0:')
print(s1.add(s2, fill_value=0))DataFrameの算術演算におけるアラインメント
2つのDataFrameを組み合わせる場合、アラインメントは行と列の両方に適用されます。結果には両方のインデックス集合と両方の列集合の和集合が含まれ、いずれかのDataFrameに値がない場所にはNaNが入ります。これは、インデックスと列を同時に対象とする完全外部結合と同等です。そのため、異なる会計期間のDataFrameを安全に加算できます。一方にしか存在しない月にはNaNが入り、後から埋めたり削除したりできます。
import pandas as pd
df1 = pd.DataFrame({'revenue': [100, 200], 'cost': [80, 150]}, index=['Jan', 'Feb'])
df2 = pd.DataFrame({'revenue': [120, 210], 'headcount': [5, 6]}, index=['Feb', 'Mar'])
result = df1 + df2
print('Combined DataFrame (union of index and columns):')
print(result)reindex()メソッド
df.reindex(new_index)は、new_indexのラベルリストに合わせた新しいDataFrameを返します。元のインデックスと新しいインデックスの両方に存在するラベルは保持され、new_indexには存在するものの元のインデックスにはないラベルにはNaNが入ります。元のインデックスにはあるもののnew_indexにはないラベルは削除されます。これは、演算前にDataFrameを目的のラベル集合に明示的にそろえる方法です。
import pandas as pd
s = pd.Series({'a': 10, 'b': 20, 'c': 30})
# Reindex to a new label set
reindexed = s.reindex(['b', 'c', 'd', 'e'])
print('Original:', s.index.tolist())
print('New index: [b, c, d, e]')
print('\nReindexed Series:')
print(reindexed)
# b, c preserved; d, e → NaN; a droppedreindex後に欠損値を埋める
reindex()では、fill_valueパラメーターを使って新しいラベルに代入する定数を指定できます。また、methodパラメーターでは前方補完('ffill')または後方補完('bfill')を指定できます。これらの補完方法は、完全な日付範囲に合わせてSeriesを再インデックス化し、欠損した日をNaNではなく直近の既知の値で埋めたい場合など、時系列データで特に役立ちます。
import pandas as pd
# Sparse daily data with gaps
s = pd.Series(
[10, 20, 30],
index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-07'])
)
# Reindex to complete date range
full_range = pd.date_range('2024-01-01', '2024-01-07')
print('Forward fill (carry last known value):')
print(s.reindex(full_range, method='ffill'))
print('\nFill with 0:')
print(s.reindex(full_range, fill_value=0))列を再インデックス化する
reindexは列にも使用できます。df.reindex(columns=['col1', 'col2', 'new_col'])のように記述します。元のDataFrameに存在しない新しい列は、NaNが入った状態で追加されます。新しいリストに含まれない既存の列は削除されます。これは、異なるソースから取得され、列の構成が一貫していない複数のDataFrameに対して、標準列スキーマを適用する場合に便利です。
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [30, 25],
'city': ['NY', 'LA']
})
# Enforce a canonical column order and add missing columns
canonical_cols = ['name', 'age', 'email', 'city', 'country']
df_reindexed = df.reindex(columns=canonical_cols)
print(df_reindexed)
# 'email' and 'country' are new → NaNalign()で2つのオブジェクトを同期する
s1.align(s2)は、同じインデックスを持つ2つの新しいオブジェクトを返します(joinパラメーターに応じて和集合または共通部分になります)。これにより、要素単位の演算を実行できる状態になります。これは、両方のオブジェクトを同時に同じラベル集合へ再インデックス化するのと同等です。共通するラベルだけを残すにはjoin='inner'を、両方のオブジェクトのすべてのラベルを残し、不一致部分をNaNにするにはjoin='outer'(デフォルト)を使用します。
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Align to common labels only (inner join)
s1_aligned, s2_aligned = s1.align(s2, join='inner')
print('Inner-aligned s1:')
print(s1_aligned)
print('Inner-aligned s2:')
print(s2_aligned)
print('\nProduct on common labels:')
print(s1_aligned * s2_aligned)mergeと算術演算におけるアラインメントの違い
Pandasには、DataFrameを組み合わせる2つの考え方があります。merge/join(SQL形式で明示的にキーを照合する方法)と、インデックスアラインメントを使った算術演算(暗黙的にラベルを基準とする方法)です。明示的なキー列を持つ構造化されたテーブルを組み合わせる場合はmergeを使います。自然に同じインデックスを共有するDataFrame同士で計算する場合は、算術演算によるアラインメントを使います。たとえば、どちらも(地域、月)をインデックスとする売上DataFrameからコストDataFrameを減算する場合です。
import pandas as pd
# Two DataFrames sharing the same index
revenue = pd.Series({'North': 500, 'South': 300, 'East': 450})
costs = pd.Series({'North': 350, 'South': 280, 'West': 400})
# Automatic alignment: 'East' and 'West' don't match → NaN
profit = revenue - costs
print('Profit by region:')
print(profit)
# If you want only common regions
profit_inner = revenue.align(costs, join='inner')[0] - revenue.align(costs, join='inner')[1]
print('\nProfit (common regions only):')
print(profit_inner)演算前にインデックスの一致を確認する
2つのDataFrameに対して演算を実行する前に、(df1.index == df2.index).all()でインデックスが一致しているか確認してください。インデックスの順序だけが異なる場合は、比較する前に両方をソートします。異なるソースから読み込んだDataFrameについては、意図しないNaNの伝播を避けるため、算術演算の前に明示的にアラインメントまたは再インデックス化を行うのがよい方法です。アラインメントに関する前提は、コメントやパイプラインのログに記録してください。
import pandas as pd
df1 = pd.DataFrame({'sales': [100, 200, 300]}, index=['Q1', 'Q2', 'Q3'])
df2 = pd.DataFrame({'cost': [80, 160, 240]}, index=['Q1', 'Q2', 'Q3'])
# Check index equality
if (df1.index == df2.index).all():
print('Indices match — safe to combine.')
combined = pd.concat([df1, df2], axis=1)
combined['profit'] = combined['sales'] - combined['cost']
print(combined)
else:
print('Indices differ — align before combining!')実践パターン:形状を標準化する
複数のファイルやAPI呼び出しからデータを読み込む場合、各バッチが異なるキーの一部だけを含むことがあります。連結や集計の前に、すべてのバッチを既知のキー空間全体に対してfill_value=0で再インデックス化します。これにより、演算前にすべてのバッチの形状(インデックスと列)が同じになり、誤った集計結果につながる、気付きにくい形状の不一致を防げます。
import pandas as pd
# Two sales batches with different product sets
batch1 = pd.Series({'laptop': 50, 'phone': 80, 'tablet': 30})
batch2 = pd.Series({'phone': 90, 'tablet': 40, 'headphones': 60})
# Full product catalogue
all_products = ['laptop', 'phone', 'tablet', 'headphones']
# Standardise both to the full catalogue
b1 = batch1.reindex(all_products, fill_value=0)
b2 = batch2.reindex(all_products, fill_value=0)
total = b1 + b2
print('Total sales per product:')
print(total)インデックスのアラインメントにおけるエッジケース
重要なエッジケースが2つあります。重複ラベル — 両方の Series に重複するインデックスラベルがある場合、アラインメントによって直積に似た展開が発生し、多数の NaN 値が生成されます(Pandas は、どの重複ラベル同士が対応するかを推測しません)。算術演算でアラインメントする前に、必ずインデックスを一意にしてください。整数インデックスと object インデックス — RangeIndex(0,5) と Int64Index([0,1,2,3,4]) は、一方が推論されたインデックスで、もう一方が明示的なインデックスであるため、演算後に完全にはアラインメントされない場合があります。reset_index(drop=True) を使用して正規化してください。
import pandas as pd
# Duplicate label alignment — produces unexpected expansion
s1 = pd.Series([1, 2, 3], index=['a', 'a', 'b'])
s2 = pd.Series([10, 20], index=['a', 'b'])
result = s1 + s2
print('Result with duplicate indices (unexpected expansion):')
print(result)
print('\nAlways ensure unique indices before arithmetic!')クイックチェック
このレッスンで学んだインデックスのアラインメントと再インデックスについて、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、Pandas が算術演算で自動的にインデックスをアラインメントし、一致しないラベルに対して NaN を生成すること、reindex() が欠損ラベルに対する補完オプションを使って DataFrame を対象ラベルの集合に合わせること、そして align() が2つのオブジェクトを同時に同じインデックスへ同期することを学びました。次は、ソート済みインデックスによるパフォーマンス上の利点と、timeit を使った測定方法について学びます。
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「インデックスの整列と再インデックス」レッスンは無料ですか?
はい。「インデックスの整列と再インデックス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「インデックスの整列と再インデックス」で何を学びますか?
reindex()で2つのDataFrameを共通のインデックスに揃え、欠損ラベルを補完し、算術演算でインデックスがどのように揃うかを理解します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「インデックスの整列と再インデックス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- MultiIndexの作成
- MultiIndexからのデータ選択
- インデックスの整列と再インデックス
- ソート済みインデックスのパフォーマンス上の利点