При парсинге CSV смотреть, что за колонка, и менять ей тип данных.
Например, используя словарь:
transforms = {
"write_bw_min_kb": int,
"cpu_user": lambda s: float(s[:-1]), #перевод из % в числа
# и так далее
}
noop = lambda s: s #а это для тех позиций, которые следует оставить строками
#а при парсинге CSV делаешь так
transform = transforms.get(col.name, noop) #определяем метод преобразования
value = transform(r[i])
#дальше используешь value
Но вообще ручное формирование JSON вызывает недоумение. Это имеет смысл если у тебя гигабайты данных, но ты же формируешь его через конкатенацию строк, что дьявольски неэффективно и медленно.
Чем тебе не по нраву json.dumps()? Сформировал структуру данных, как она нужна, и сдампил.