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)
  1. 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]values
  2. filled ← []

    1values = [3.1, None, 7.2, None, 5.0, None, 8.4, 2.9]2filled = []3for v in values:
    values this step[]filled
  3. v ← 3.1

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this step3.1v
  4. filled ← [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]filled
  5. v ← None

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this step3.1 Nonev
  6. filled ← [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]filled
  7. v ← 7.2

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this stepNone 7.2v
  8. filled ← [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]filled
  9. v ← None

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this step7.2 Nonev
  10. filled ← [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]filled
  11. v ← 5.0

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this stepNone 5.0v
  12. filled ← [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]filled
  13. v ← None

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this step5.0 Nonev
  14. filled ← [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]filled
  15. v ← 8.4

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this stepNone 8.4v
  16. filled ← [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]filled
  17. v ← 2.9

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
    values this step8.4 2.9v
  18. filled ← [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]filled
  19. for v in values:

    2filled = []3for v in values:4    filled.append(v if v is not None else 0.0)
  20. 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) preserves float64 — the filled positions become 0.0, not the integer 0. 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.