Last night's win, thus, took India one step closer to a maiden series triumph in South Africa.
Kohli reaffirmed his status as an ODI great with an unbeaten 160 off 159 balls on a challenging surface, propelling India to 303 for six.
It was the 34th ODI hundred for the Indian captain, who is now 15 shy of Sachin Tendulkar's mark of 49.
While most Indian batsmen struggled after South Africa opted to bowl, Kohli made batting look easy. Shikhar Dhawan too stood out with a fluent 76 off 63 balls.
Also Read
South Africa started the chase on a promising note with captain Aiden Markram (32) and JP Duminy (51) sharing a 78-run stand for the second wicket.
But most of their runs came against the pacers and when Indian spinners got into the act, it was a familiar story as South Africa surrendered to Yuzvendra Chahal (4/46) and Kuldeep Yadav (4/23) to end way behind at 170 all out in 40 overs.
The slide began with the fall of Markram, who was stumped by MS Dhoni after getting beaten by a flighted delivery from Yadav.
It happened to be Dhoni's 400th dismissal in ODIs as he became only the fourth wicket-keeper to reach that milestone in ODIs.
Not reading the spinners led to South African batsmen being defensive which pushed the run-rate up. From a healthy 79 for one in the 17th over, the hosts were reduced to 129 for five in the 33rd over, ending all their hopes of a recovery.
Such was the nature of his innings that he scored only 60 runs through boundaries while he had to run hard for the remaining 100. In total, he collected 12 fours and two sixes.
He also became the first Indian batsman to score a hundred against South Africa at Newlands. Only Ganguly previously had an ODI century at this ground, but that came against Kenya in March 2003.
He went past Ganguly again, who has 11 centuries in 142 innings. Kohli now boasts of 12 hundreds as skipper but in only 43 innings.
Kohli, with 318 runs in this series so far, now also has the most runs for a visiting batsman in a bilateral ODI series against South Africa in South Africa. Ricky Ponting, with 283 runs in 2001-02, was the previous best.
In terms of balls faced, it was the joint-slowest hundred for Kohli, after he faced 119 balls against Pakistan at Adelaide in 2015. But in doing so, Kohli put on 140 runs with Dhawan for the second wicket.
Andile Phehlukwayo was included ahead of Tabraiz Shamsi as the hosts played only full-time spinner. India fielded an unchanged side again.
Rohit Sharma (0) continued his poor run in this ODI series and was caught behind off the sixth ball he faced. The three-time ODI double-centurion now averages 12.10 in 10 innings on South African soil and has an ODI high score of only 23.
Dhawan and Kohli then came together, and piled on the runs, almost continuing from where they had left off in the previous match.
Momentarily though, Indias run-rate dipped below 5/over as Chris Morris (1-45) exerted some control over proceedings. In the meantime, Dhawan scored his 25th ODI half-century off 42 balls and took his team past 100 in the 18th over.
Dhawan accelerated after reaching his mark, and scored 26 runs off next 21 balls he faced. Part of the reason had to do with Imran Tahirs (1-52) inclusion into the attack as Dhawan-Kohli pairing milked his bowling for runs.
South Africa then triggered a mini-collapse in the middle order as India lost three wickets for 48 runs.
MS Dhoni (10) then stemmed the down-curve and added 40 runs with Kohli.
Kedar Jadhav (1) played a nothing shot and edged behind off Phehlukwayo (1-42) as India were reduced to 236 for six in the 43rd over.
The skipper then found a stable partner in Bhuvneshwar Kumar (16 not out) and the duo added 63 runs off only 43 balls for the seventh wicket.
Disclaimer: No Business Standard Journalist was involved in creation of this content