Missing Values
Fill with Constant
Replace missing values in a numeric sequence with a fixed default. By hand,
loop over the values and substitute None entries with 0.0. With pandas,
Series.fillna(0) replaces every NaN in one call and preserves the
float64 dtype throughout.
By hand
Walk each element. When v is not None keep it as-is; otherwise append
0.0. The trace shows filled gaining one element per iteration, with
0.0 appearing at each None position.
naive.py
Replay: real traced execution (multi-file project)
values = [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]
filled = []
for v in values:
filled.append(v if v is not None else 0.0)
print('RESULT:', filled)
values ← [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]
1values = [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]2filled = []values this step[3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]valuesfilled ← []
1values = [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]2filled = []3for v in values:values this step[]filledv ← 3.1
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this step3.1vfilled ← [3.1]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[] → [3.1]filledv ← None
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this step3.1 → Nonevfilled ← [3.1, 0.0]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1] → [3.1, 0.0]filledv ← 7.2
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this stepNone → 7.2vfilled ← [3.1, 0.0, 7.2]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0] → [3.1, 0.0, 7.2]filledv ← None
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this step7.2 → Nonevfilled ← [3.1, 0.0, 7.2, 0.0]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0, 7.2] → [3.1, 0.0, 7.2, 0.0]filledv ← 5.0
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this stepNone → 5.0vfilled ← [3.1, 0.0, 7.2, 0.0, 5.0]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0, 7.2, 0.0] → [3.1, 0.0, 7.2, 0.0, 5.0]filledv ← None
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this step5.0 → Nonevfilled ← [3.1, 0.0, 7.2, 0.0, 5.0, 0.0]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0, 7.2, 0.0, 5.0] → [3.1, 0.0, 7.2, 0.0, 5.0, 0.0]filledv ← 8.4
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this stepNone → 8.4vfilled ← [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0, 7.2, 0.0, 5.0, 0.0] → [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4]filledv ← 2.9
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)values this step8.4 → 2.9vfilled ← [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4, 2.9]
3for v in values:4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this step[3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4] → [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4, 2.9]filledfor v in values:
2filled = []3for v in values:4 filled.append(v if v is not None else 0.0)stdout ← RESULT: [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4, 2.9]
4 filled.append(v if v is not None else 0.0)5print('RESULT:', filled)values this stepRESULT: [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4, 2.9]stdout
With pandas
s.fillna(0) returns a new Series with every NaN replaced by 0. The
snapshot shows the original series (with nan) under before: and the
filled values in RESULT:, making the substitution positions visible.
library.py
import pandas as pd
from dalib.display import set_display
set_display()
values = [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]
s = pd.Series(values, dtype=float)
filled = s.fillna(0)
result = filled.tolist()
print('index:', s.index.tolist())
print('dtype:', s.dtype)
print('before:', s.tolist())
print('RESULT:', result)
index: [0, 1, 2, 3, 4, 5, 6, 7]
dtype: float64
before: [3.1, nan, 7.2, nan, 5.0, nan, 8.4, 2.9]
RESULT: [3.1, 0.0, 7.2, 0.0, 5.0, 0.0, 8.4, 2.9]
Implementation notes
fillna(0)preservesfloat64— the filled positions become0.0, not the integer0. This keeps the dtype uniform and avoids surprises in downstream arithmetic.- For non-numeric columns, pass a string default:
s.fillna('unknown'). - To fill with the column mean instead of a constant, see
fill-mean(this chapter). - Cross-reference:
detect-missing(this chapter) to audit which positions were missing before filling.