A tight encounter was short on clear-cut chances, although Kyle Bennett and Brett Pitman both went close, while the latter also had a goal disallowed.
But Thomas found the net just after the restart before substitute Gino van Kessel and Josh Ruffels both notched late on to ensure the Blues suffered their first league loss of the season.
Kenny Jackett stuck with the same side that were narrowly beaten at Cardiff in the Carabao Cup earlier in the week.
That meant Kal Naismith continued to lead the line, with teenager Adam May given another chance to impress in midfield.
Oxford handed starts to three former Blues players, with keeper Simon Eastwood, defender Mike Williamson and striker Thomas all featuring.
It was the hosts who dominated possession during the first half, although Pompey laid claim to the better of the scoring chances.
Jack Whatmough could not get on the end of a Gareth Evans corner in the opening stages, while Pitman met May’s centre and sent a firm header narrowly past the post.
Bennett then tried his luck with a snap-shot from outside the box, with Eastwood scrambling across his goal to palm the ball behind.
The hosts started to look more threatening as the half progressed and Drew Talbot did well to cut across and prevent Thomas from getting a shot away.
Then, moments later, Christian Burgess made a crunching tackle to dispossess Christian Ribeiro on the edge of the box.
Pompey won a few corners and one of them from Evans was nodded back across goal by Burgess, only for Whatmough to head into Eastwood’s arms.
But United then had their best chance of the half on 39 minutes, as Curtis Nelson turned Williamson’s pass wide from close range.
Pitman did have the ball in the back of the net at the other end moments later when he met Brandon Haunstrup’s cross, but referee Graham Salisbury spotted a foul.
There were still time for Bennett have a shot in stoppage-time, although his cleanly-struck effort was straight at Eastwood.
Oxford United 0
It had been a fairly calm opening first half, but Oxford broke the deadlock within a couple of minutes of the restart.
McGee failed to hold on to an angled drive from Ribeiro and Thomas was well placed to force home the loose ball.
A substitution then had to be made, as referee Salisbury – who seemed to walk off relatively untroubled – was replaced by fourth official Marc Wilson.
Naismith was not too far away from an equaliser when he sent in a corner from the right that almost swung in at the far post.
But that was his last piece of the action as, just seconds later, the Scottish forward was replaced by Conor Chaplin.
It became an end-to-end affair, as Pompey went in search of a leveller and Oxford looked to hit them on the break.
A couple of dangerous crosses from Talbot and Brandon Haunstrup were dealt with assuredly by Williamson.
On both occasions the hosts were quickly up the other end to go close themselves and twice Burgess came to the rescue, first with a key tackle and then a crucial block.
The Blues made their second switch on 69 minutes and it was an attacking one, with Talbot making way for Carl Baker and Evans moving to right-back.
A moment of confusion between Burgess and Evans almost gave Oxford a second goal soon after, but McGee managed to push Jon Obika’s effort over the bar.
The hosts did wrap things up on 82 minutes, however, when van Kessel – who had only just come on – cut in from the left and coolly fired home.
Pompey kept battling away, but were unable to send the large travelling support home with at least a consolation effort to cheer.
And their misery was compunded deep into stoppage-time when Jack Payne slipped in Ruffels to slot home a third for the hosts.
Oxford (4-2-3-1): Eastwood; Ribeiro, Nelson (c), Williamson, Ricardinho; Ledson, Ruffels; Henry (Hall 76), Payne, Johnson (van Kessel 79); Thomas (Obika 69)
Goals: Thomas 47, van Kessel 82, Ruffels 90+4
Subs not used: Shearer, Carroll, Martin, Rothwell
Pompey (4-2-3-1): McGee; Talbot (Baker 69), Burgess, Whatmough, Haunstrup; May, Rose; Evans, Pitman (c), Bennett; Naismith (Chaplin 56)
Subs not used: Bass, Davies, Close, Main, Kabamba
Referee: Graham Salisbury (Marc Wilson 51)
Attendance: 9,510 (1,810 Pompey fans)