Округление столбца 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