Это потребует манипуляций со строками, учитывая, что простое форматирование не работает. Это подбирает модификацию числа, умножает его на 60, форматирует оба и затем объединяет:
df.withColumn('total_hours_str',
f.concat(f.regexp_replace(f.format_number(f.floor(df.total_hours), 0), ',', ''),
f.lit(':'),
f.lpad(f.format_number(df.total_hours%1*60, 0), 2, '0'))).show()
Вывод:
+----+-----------+---------------+
|col1|total_hours|total_hours_str|
+----+-----------+---------------+
|obj1| 48387.837| 48387:50|
|obj2| 45570.0201| 45570:01|
|obj3| 39339.669| 39339:40|
|obj4| 37673.235| 37673:14|
|obj5| 3576.0| 3576:00|
+----+-----------+---------------+
EDIT: Поскольку у вас есть дробные значения, которые в конечном итоге округляются до целого часа, я предлагаю вам округлить перед обработкой столбца:
df.withColumn('rounded_total_hours', f.round(df['total_hours'],2))\
.withColumn('total_hours_str',
f.concat(f.regexp_replace(f.format_number(f.floor(f.col('rounded_total_hours')), 0), ',', ''),
f.lit(':'),
f.lpad(f.format_number(f.col('rounded_total_hours')%1*60, 0), 2, '0'))).show()
Что дает:
+----+-----------+-------------------+---------------+
|col1|total_hours|rounded_total_hours|total_hours_str|
+----+-----------+-------------------+---------------+
|obj1| 48387.837| 48387.84| 48387:50|
|obj2| 45570.0201| 45570.02| 45570:01|
|obj3| 39339.669| 39339.67| 39339:40|
|obj4| 37673.235| 37673.24| 37673:14|
|obj5| 3576.0| 3576.0| 3576:00|
|obj6| 15287.9999| 15288.0| 15288:00|
+----+-----------+-------------------+---------------+