problem resolved: The suggestion to remove trailing newlines in my row construction is a good one so i have Updated my loop to avoid extra whitespace.
# Loop through each subject to build the table rows
for i, subject in enumerate(subjects):
row = (
f"<tr>"
f"<td>{subject}</td>"
f"<td>{counts.iloc[i]}</td>"
f"<td>{means.iloc[i]:.2f}</td>"
f"<td>{stdvs.iloc[i]:.2f}</td>"
f"<td>{variances.iloc[i]:.2f}</td>"
f"<td>{mins.iloc[i]}</td>"
f"<td>{medians.iloc[i]}</td>"
f"<td>{maxs.iloc[i]}</td>"
f"<td>{ranges.iloc[i]}</td>"
f"</tr>"
)