Duplicates
Find Exact Duplicates
Flag each element that is a repeat of an earlier occurrence. By hand, keep
a seen dict and mark each element True if it is already present. With
pandas, DataFrame.duplicated() returns a boolean Series where True
marks every row after its first occurrence.
By hand
Before appending to flags, check whether name is already in seen.
Then record seen[name] = True so later occurrences are caught. The trace
shows seen growing as new names are encountered and flags accumulating
a True each time a repeat is detected.
naive.py
Replay: real traced execution (multi-file project)
names = ['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']
seen = {}
flags = []
for name in names:
flags.append(name in seen)
seen[name] = True
print('RESULT:', flags)
names ← ['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']
1names = ['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']2seen = {}values this step['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']namesseen ← {}
1names = ['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']2seen = {}3flags = []values this step{}seenflags ← []
2seen = {}3flags = []4for name in names:values this step[]flagsname ← 'Alice'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Alice'nameflags ← [False]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[] → [False]flagsseen ← {'Alice': True}
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)values this step{} → {'Alice': True}seenname ← 'Bob'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Alice' → 'Bob'nameflags ← [False, False]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[False] → [False, False]flagsseen ← {'Alice': True, 'Bob': True}
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)values this step{'Alice': True} → {'Alice': True, 'Bob': True}seenname ← 'Alice'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Bob' → 'Alice'nameflags ← [False, False, True]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[False, False] → [False, False, True]flagsseen[name] = True
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)name ← 'Carol'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Alice' → 'Carol'nameflags ← [False, False, True, False]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[False, False, True] → [False, False, True, False]flagsseen ← {'Alice': True, 'Bob': True, 'Carol': True}
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)values this step{'Alice': True, 'Bob': True} → {'Alice': True, 'Bob': True, 'Carol': True}seenname ← 'Bob'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Carol' → 'Bob'nameflags ← [False, False, True, False, True]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[False, False, True, False] → [False, False, True, False, True]flagsseen[name] = True
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)name ← 'Dave'
3flags = []4for name in names:5 flags.append(name in seen)values this step'Bob' → 'Dave'nameflags ← [False, False, True, False, True, False]
4for name in names:5 flags.append(name in seen)6 seen[name] = Truevalues this step[False, False, True, False, True] → [False, False, True, False, True, False]flagsseen ← {'Alice': True, 'Bob': True, 'Carol': True, 'Dave': True}
5 flags.append(name in seen)6 seen[name] = True7print('RESULT:', flags)values this step{'Alice': True, 'Bob': True, 'Carol': True} → {'Alice': True, 'Bob': True, 'Carol': True, 'Dave': True}seenfor name in names:
3flags = []4for name in names:5 flags.append(name in seen)stdout ← RESULT: [False, False, True, False, True, False]
6 seen[name] = True7print('RESULT:', flags)values this stepRESULT: [False, False, True, False, True, False]stdout
With pandas
df.duplicated() scans rows and marks every row after the first occurrence
of each value as True. The result is a boolean dtype: bool Series.
library.py
import pandas as pd
from dalib.display import set_display
set_display()
names = ['Alice', 'Bob', 'Alice', 'Carol', 'Bob', 'Dave']
df = pd.DataFrame({'name': names})
flags = df.duplicated()
result = flags.tolist()
print('index:', flags.index.tolist())
print('dtype:', flags.dtype)
print('values:', flags.tolist())
print('RESULT:', result)
index: [0, 1, 2, 3, 4, 5]
dtype: bool
values: [False, False, True, False, True, False]
RESULT: [False, False, True, False, True, False]
Implementation notes
duplicated()useskeep='first'by default — the first occurrence isFalse(not a duplicate) and all later ones areTrue. Usekeep='last'to keep the last occurrence instead, orkeep=Falseto flag every copy including the first.- Pass
subset=['col1', 'col2']to check duplicates only on specific columns rather than all columns. - Cross-reference:
drop-duplicates-keep-first(this chapter) to remove the flagged rows in one step rather than just identifying them.