Build a boolean mask by testing each record's score field in a loop, then keep only the rows where the mask is True. With pandas, a single comparison on a column produces a boolean Series, and indexing a DataFrame with it returns the matching rows in one step.

By hand

Loop over records to build mask (one bool per row). Loop over indices to collect names where mask[i] is True.

naive.py
Replay: real traced execution (multi-file project)
# trace: ignore records
records = [
    {'name': 'al', 'score': 55},
    {'name': 'bo', 'score': 82},
    {'name': 'cy', 'score': 71},
    {'name': 'di', 'score': 90},
]
k = 70
mask = []
for r in records:
    mask.append(r['score'] >= k)
names = []
for i in range(len(records)):
    if mask[i]:
        names.append(records[i]['name'])
print('RESULT:', names)
  1. {'name': 'al', 'score': 55},

    2records = [3    {'name': 'al', 'score': 55},4    {'name': 'bo', 'score': 82},
  2. {'name': 'bo', 'score': 82},

    3{'name': 'al', 'score': 55},4{'name': 'bo', 'score': 82},5{'name': 'cy', 'score': 71},
  3. {'name': 'cy', 'score': 71},

    4{'name': 'bo', 'score': 82},5{'name': 'cy', 'score': 71},6{'name': 'di', 'score': 90},
  4. {'name': 'di', 'score': 90},

    5    {'name': 'cy', 'score': 71},6    {'name': 'di', 'score': 90},7]
  5. records = [

    1# trace: ignore records2records = [3    {'name': 'al', 'score': 55},
  6. k ← 70

    7]8k = 709mask = []
    values this step70k
  7. mask ← []

    8k = 709mask = []10for r in records:
    values this step[]mask
  8. r ← {'name': 'al', 'score': 55}

    9mask = []10for r in records:11    mask.append(r['score'] >= k)
    values this step{'name': 'al', 'score': 55}r
  9. mask ← [False]

    10for r in records:11    mask.append(r['score'] >= k)12names = []
    values this step[] [False]mask
  10. r ← {'name': 'bo', 'score': 82}

    9mask = []10for r in records:11    mask.append(r['score'] >= k)
    values this step{'name': 'al', 'score': 55} {'name': 'bo', 'score': 82}r
  11. mask ← [False, True]

    10for r in records:11    mask.append(r['score'] >= k)12names = []
    values this step[False] [False, True]mask
  12. r ← {'name': 'cy', 'score': 71}

    9mask = []10for r in records:11    mask.append(r['score'] >= k)
    values this step{'name': 'bo', 'score': 82} {'name': 'cy', 'score': 71}r
  13. mask ← [False, True, True]

    10for r in records:11    mask.append(r['score'] >= k)12names = []
    values this step[False, True] [False, True, True]mask
  14. r ← {'name': 'di', 'score': 90}

    9mask = []10for r in records:11    mask.append(r['score'] >= k)
    values this step{'name': 'cy', 'score': 71} {'name': 'di', 'score': 90}r
  15. mask ← [False, True, True, True]

    10for r in records:11    mask.append(r['score'] >= k)12names = []
    values this step[False, True, True] [False, True, True, True]mask
  16. for r in records:

    9mask = []10for r in records:11    mask.append(r['score'] >= k)
  17. names ← []

    11    mask.append(r['score'] >= k)12names = []13for i in range(len(records)):
    values this step[]names
  18. i ← 0

    12names = []13for i in range(len(records)):14    if mask[i]:
    values this step0i
  19. if mask[i]:

    13for i in range(len(records)):14    if mask[i]:15        names.append(records[i]['name'])
  20. i ← 1

    12names = []13for i in range(len(records)):14    if mask[i]:
    values this step0 1i
  21. if mask[i]:

    13for i in range(len(records)):14    if mask[i]:15        names.append(records[i]['name'])
  22. names ← ['bo']

    14    if mask[i]:15        names.append(records[i]['name'])16print('RESULT:', names)
    values this step[] ['bo']names
  23. i ← 2

    12names = []13for i in range(len(records)):14    if mask[i]:
    values this step1 2i
  24. if mask[i]:

    13for i in range(len(records)):14    if mask[i]:15        names.append(records[i]['name'])
  25. names ← ['bo', 'cy']

    14    if mask[i]:15        names.append(records[i]['name'])16print('RESULT:', names)
    values this step['bo'] ['bo', 'cy']names
  26. i ← 3

    12names = []13for i in range(len(records)):14    if mask[i]:
    values this step2 3i
  27. if mask[i]:

    13for i in range(len(records)):14    if mask[i]:15        names.append(records[i]['name'])
  28. names ← ['bo', 'cy', 'di']

    14    if mask[i]:15        names.append(records[i]['name'])16print('RESULT:', names)
    values this step['bo', 'cy'] ['bo', 'cy', 'di']names
  29. for i in range(len(records)):

    12names = []13for i in range(len(records)):14    if mask[i]:
  30. stdout ← RESULT: ['bo', 'cy', 'di']

    15        names.append(records[i]['name'])16print('RESULT:', names)
    values this stepRESULT: ['bo', 'cy', 'di']stdout

With pandas

df['score'] >= k produces a boolean Series. df[mask] keeps only the rows where the Series is True and returns a sub-DataFrame.

library.py
import pandas as pd
from dalib.display import set_display
set_display()

records = [
    {'name': 'al', 'score': 55},
    {'name': 'bo', 'score': 82},
    {'name': 'cy', 'score': 71},
    {'name': 'di', 'score': 90},
]
k = 70
df = pd.DataFrame(records)
mask = df['score'] >= k
filtered = df[mask]
print('mask:', mask.tolist())
print('names:', filtered['name'].tolist())
print('shape:', filtered.shape)
print('RESULT:', filtered['name'].tolist())
mask: [False, True, True, True]
names: ['bo', 'cy', 'di']
shape: (3, 2)
RESULT: ['bo', 'cy', 'di']

Implementation notes

  • A boolean Series used as a row index is called boolean indexing. The Series must have the same index as the DataFrame; pandas aligns on labels before filtering.
  • The filtered result preserves the original integer index of matching rows (bo=1, cy=2, di=3 here). Use .reset_index(drop=True) afterward if you need a fresh 0-based index.
  • df['score'] >= k is vectorized — no Python loop over values. Pandas applies the comparison to the underlying numpy array directly (see mask-from-threshold in python-numpy ch06).
  • Cross-reference: filter-with-mask (python-numpy ch06) for the array version; filter-by-threshold (python-data-basics) for the pure-Python version.