Округление столбца pandas с до целого сохранением суммы

Столбец float в pandas в сумме - целое число. Как округлить этот столбец до целых, чтобы после округления его сумма не изменилась? Без цикла for!

Пробовал написать что-то такое, но безуспешно

def special_round(ser: pd.Series):
    stopper = 0
    while stopper != diff_sum:
        diff_row = ser.round() - ser
        diff_sum = ser.round().sum() - ser.people.sum()
        if diff_sum > 0:
            ser.max() += 1
            stopper += 1
        else:
            ser.min() - 1
            stopper += 1

Ответы (1 шт):

Автор решения: CrazyElf

Вопрос не совсем однозначный, но могу предложить просто раскидать по единичке всю разницу между округлением и исходной суммой. На примере 50 значений по 0.1:

import pandas as pd

# Подготовка и проверка данных
df = pd.DataFrame({'num': [0.1]*50})
sum_float = df['num'].sum()
print(f'Сумма float: {sum_float:.0f}')
df['num'] = df['num'].astype(int)
sum_int = df['num'].sum()
print(f'Сумма int: {sum_int:.0f}')

# Здесь кидаем по единичке в столько элементов, сколько у нас разница
ones_num = int(round(sum_float - sum_int))
df.iloc[:ones_num, 0] += 1

# Проверяем
sum_int = df['num'].sum()
print(f'Исправленная сумма int: {sum_int:.0f}')

Вывод:

Сумма float: 5
Сумма int: 0
Исправленная сумма int: 5
→ Ссылка