Проблема в том, что вы постоянно фильтруете DataFrame, ища все записи, идентификаторы которых совпадают с текущей строкой. Более того, вы делаете это дважды: один раз для среднего и один раз для размера.
Это ситуация, когда вы должны использовать groupby () для идентификатора и агрегировать остаток.
Если я понимаю, что вашей конечной целью является вычисление стандартного отклонения для каждого идентификатора, попробуйте что-то вроде этого:
import numpy as np
D = C.groupby("ID")["residual"].agg([np.mean, np.size, np.var, np.std]).reset_index()
D должен быть DataFrame с вычисленной статистикой (может потребоваться переименовать столбцы).