Спасибо за все ответы, вдохновленные @Joe, я придумал:
df = df.round({'a':3, 'b':3, 'c':3, 'd':10})
или более обобщенно
df = df.round({c:r for c, r in zip(df.columns, [3, 3, 3, 10])})
Это обходной путь и не отвечает на оригинальный вопрос, round
изменяет базовый фрейм данных, что может быть нежелательно.