Reindexing and Data Alignment
Two related ideas
- Reindexing — you explicitly ask pandas to rearrange an object onto a new index,
introducing
NaNNaNfor any label that wasn’t already there. - Alignment — pandas does this automatically whenever you do arithmetic between two Series or DataFrames with different indexes.
Both boil down to the same rule: match by label, not by position.
reindex: rearranging onto a new index
import pandas as pd
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=["d", "b", "a", "c"])
print(obj.reindex(["a", "b", "c", "d", "e"])) # "e" wasn't there -> NaNimport pandas as pd
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=["d", "b", "a", "c"])
print(obj.reindex(["a", "b", "c", "d", "e"])) # "e" wasn't there -> NaNFor ordered data, method="ffill"method="ffill" fills in the gaps using the last known value
instead of leaving NaNNaN:
import numpy as np
obj3 = pd.Series(["blue", "purple", "yellow"], index=[0, 2, 4])
print(obj3.reindex(np.arange(6), method="ffill"))import numpy as np
obj3 = pd.Series(["blue", "purple", "yellow"], index=[0, 2, 4])
print(obj3.reindex(np.arange(6), method="ffill"))Reindexing a DataFrame — rows, columns, or both
frame = pd.DataFrame(
np.arange(9).reshape((3, 3)),
index=["a", "c", "d"],
columns=["Ohio", "Texas", "California"],
)
print(frame.reindex(index=["a", "b", "c", "d"])) # "b" is new -> NaN row
print(frame.reindex(columns=["Texas", "Utah", "California"])) # "Utah" is new, "Ohio" droppedframe = pd.DataFrame(
np.arange(9).reshape((3, 3)),
index=["a", "c", "d"],
columns=["Ohio", "Texas", "California"],
)
print(frame.reindex(index=["a", "b", "c", "d"])) # "b" is new -> NaN row
print(frame.reindex(columns=["Texas", "Utah", "California"])) # "Utah" is new, "Ohio" droppedAutomatic alignment in arithmetic
You never call reindexreindex yourself before adding two Series — pandas does it for you,
using the union of both indexes:
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=["a", "c", "d", "e"])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=["a", "c", "e", "f", "g"])
print(s1 + s2)s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=["a", "c", "d", "e"])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=["a", "c", "e", "f", "g"])
print(s1 + s2)Labels present in only one of the two Series become NaNNaN in the result — "d""d" and
"f""f"/"g""g" never had a matching partner to add against.
Filling gaps during arithmetic: fill_value
If you’d rather treat a missing label as 00 (or some other value) instead of NaNNaN,
use the method form of the operator with fill_valuefill_value:
df1 = pd.DataFrame(np.arange(9.0).reshape(3, 3), columns=list("bcd"))
df2 = pd.DataFrame(np.arange(12.0).reshape(4, 3), columns=list("bde"))
print(df1.add(df2, fill_value=0))df1 = pd.DataFrame(np.arange(9.0).reshape(3, 3), columns=list("bcd"))
df2 = pd.DataFrame(np.arange(12.0).reshape(4, 3), columns=list("bde"))
print(df1.add(df2, fill_value=0))The same fill_valuefill_value idea also works directly on reindexreindex:
print(df1.reindex(columns=df2.columns, fill_value=0))print(df1.reindex(columns=df2.columns, fill_value=0))Common pitfalls
df1 + df2df1 + df2(the operator) always producesNaNNaNfor non-overlapping labels — use.add().add(),.sub().sub(),.mul().mul(),.div().div()withfill_valuefill_valueif you want zeros instead.reindexreindexcreates missing rows/columns; it never drops data implicitly unless a label from the original index is missing from the new one.method="ffill"method="ffill"onreindexreindexrequires the index to already be sorted in the order you expect the fill to follow.
Visualize it
flowchart LR A["Series 1
index: a, c, d, e"] --> C["Union index
a, c, d, e, f, g"] B["Series 2
index: a, c, e, f, g"] --> C C --> D["s1 + s2
NaN where either side is missing"]
🧪 Try It Yourself
Exercise 1 – Reindex Onto a Larger Index
Exercise 2 – Automatic Alignment in Arithmetic
Exercise 3 – Fill Gaps Instead of Producing NaN
Next
With your index aligned the way you want, you’re ready to narrow rows down further — continue to Filtering with Conditions (and, or, isin, query).
If this helped you, consider buying me a coffee ☕
Buy me a coffeeWas this page helpful?
Let us know how we did
