Julian Draxler’s low drive gave PSG the lead shortly before half-time.
Randal Kolo Muani capitalised on a mistake by Kylian Mbappe to bring Nantes level after the break, before setting up Moses Simon to slide home the winner.
The defeat means PSG stay second, with Lille three points clear at the top after a goalless draw at Monaco.
Mauricio Pochettino’s side, who knocked Barcelona out of the Champions League in midweek, have lost seven league games already this season and this latest loss means they have suffered back-to-back Ligue 1 defeats at the Parc des Princes for the first time since 2012.
They looked set for a comfortable evening when Draxler’s effort from just inside the area had too much power for Alban Lafont.
But visitors Nantes, who went into the game second from bottom in Ligue 1, were much improved after the break and were rewarded with a memorable victory.
They equalised when a sloppy cross-field pass from Mbappe went straight to the lively Kolo Muani, who fired the ball high past Keylor Navas from inside the area.
There was a strange moment soon after when Angel di Maria was substituted and disappeared quickly down the tunnel. PSG later told the AFP news agency that Di Maria was one of two players whose houses had been burgled during the game.
When play resumed, Kolo Muani turned provider when he raced onto a long pass before teeing the ball up for Simon to score from close range.
PSG’s best chance to equalise fell to Leandro Paredes, but his shot was brilliantly saved by Lafont.
The win moves Nantes above Nimes and to within a point of 17th-placed Lorient.