Having failed to qualify for Europe this season, both Milan giants are desperate to make up for years of underachievement – and on this performance may now fancy their chances of a top finish, especially given Juventus's early season woes.
Inter now sit two points clear of Chievo with a maximum nine points although Roma, also on seven points, are the Nerazzurri's more notable challengers.
Champions Juventus, with two losses and a draw so far, are down in 16th, eight points off the pace as they endure their worst start to a season in living memory.
“Milan started well, they had us in difficulty at times but it wasn't enough,” said Inter coach Roberto Mancini.
“In the end, we deserved the win, but Milan are a good side and they will be battling for a top finish. Juventus as well.
“That's the beauty of football, Juventus haven't won in three games but I'm sure they will get back to being protagonists soon enough.”
Milan coach Sinisa Mihajlovic had only praise for his team, but lamented their failure to pull level.
“We didn't deserve to lose. We played well, tried to win and all we lacked was a goal,” said Mihajlovic.
“I'm happy, I'm proud and the lads can hold their heads high. It's by playing like this that we can start to look at how well we can do in the league.”
Milan shaded a lively opening half in which Carlos Bacca and Luiz Adriano kept the Nerazzurri defence on their toes, home 'keeper Samir Handanovic notably saving at Adriano's feet early on, while on-loan Manchster City forward Stevan Jovetic drilled just wide of Diego Lopez's post at the other end.
In the last six league derbies neither side had scored more than one goal and the near capacity crowd of 79,154 fans almost saw Milan break the deadlock when Adriano blazed over while under pressure after latching on to Bacca's neat pass.
Inter were looking nervous, and Milan almost capitalized.
When Giacomo Bonaventura countered on 19 minutes, his pinpoint pass found Adriano but the Brazilian was blocked by Juan Jesus as he was about to pull the trigger.
On the stroke of half-time, Milan breathed a sigh of relief when Lopez produced a wonderful reflex save to deny striker Mauro Icardi from close range.
Jovetic produced Inter's first chance of the second half after a poor Lopez clearance, but the Argentinian's effort was blocked by a Milan boot.
Milan began to build momentum again but on the counter Inter proved dangerous. An Ivan Perisic ball from the left flank caused confusion and Lopez tipped Guarin's bouncing header over the bar.
The Spanish goalkeeper was finally beaten when Milan's defence fatally backed off and allowed Guarin to unleash a drive that beat Lopez at his far corner for his 15th Serie A goal on his 100th league appearance.
Mihajlovic immediately replaced Bacca with Balotelli, the former Inter striker's arrival prompting a deafening chorus of boos that quietened when the on-loan Liverpool forward whipped in a free-kick that went dangerously close to Handanovic's far post.
Defender Alex Telles made his Inter debut when he replaced Jesus and, moments later, he did well to block Honda's cross from the right, while at the other end Abate intervened in timely fashion to block Icardi's effort on goal from Davide Santon's nicely weighted pass.
Balotelli, however, was making an impact, notably shaving the outside of Handanovic's post from outside the area with 12 minutes left on the clock.
Minutes later he won a free kick from a challenge by Guarin, and from 35 yards drove just wide of the upright.
Mancini responded by replacing Perisic with defender Andtea Ranocchia with five minutes to play and Inter hung on to claim city bragging rights.