Я уже ответил на это, но почему-то ответ был преобразован в комментарий. Тем не менее, это наиболее эффективное решение:
Невозможно включить (и распространять) NaNs в группах, довольно усугубляет ситуацию. Цитирование R не является убедительным, поскольку это поведение не согласуется с множеством других вещей. Во всяком случае, фиктивный взлом также довольно плох. Однако размер (включая NaN) и счетчик (игнорирует NaN) группы будут отличаться, если есть NaNs.
dfgrouped = df.groupby(['b']).a.agg(['sum','size','count'])
dfgrouped['sum'][dfgrouped['size']!=dfgrouped['count']] = None
Когда они отличаются, вы можете установить значение обратно в None для результат функции агрегации для этой группы.