Looks like NaN has some trailing or leading empty chars. After removing those empty chars, df.dropna() does remove the line with NaN in it.