The victory ended a season-best 6-3 homestand and bumped the Royals' record in 2007 Interleague series to 4-0.
Kansas City used six-plus serviceable innings from Bannister, several bloop hits and terrific bullpen work from Zack Greinke and Octavio Dotel to win its third straight series and move to 28-42. It marks the first time the Royals have been 14 games under .500 since June 2.
"It's not going to be one game that turns everything around," Mark Teahen said. "But I think that as long as we continue to do the things that we are doing, have quality at-bats and our pitchers being competitive on the mound, we should be headed in the right direction."
And it started with Bannister. The right-hander won his fourth straight start -- and third one following a Royals loss. This wasn't quite like the past three, outings that yielded a 3-0 record, 0.41 ERA and no walks in 22 innings.
Instead, he had to fight the entire afternoon, often missing location with his pitches. Bannister had to make adjustments, but he constantly threw strikes, walking just one batter.
"I was really struggling to get balls to the outside corner," Bannister said. "I was stepping a little closed. I noticed my footprint was a little different. I was a little up, and instead of fighting it, you always go with it. You start pitching balls above the zone and get them to chase that."
He didn't give in, didn't see his start short circuited because he threw pitches over the heart of the plate. Bannister tossed six-plus innings of four-run ball, just the second time in the last five games a KC starter has worked past the fifth inning.
"It's nice to see a guy not have his good stuff and not have his good command and still pitch well," manager Buddy Bell said.
The Marlins nicked Bannister for single runs in the second -- ending an 18-inning streak without allowing an earned run -- and third.
The offense, though, never stopped battling, never stopped coming back.
Down, 1-0, and 2-1, the Royals scored three times in the bottom of the third off Scott Olsen.
With one out and David DeJesus on first, Teahen dumped a soft single into left field. After Mike Sweeney flied out, Emil Brown lofted a short single into center field.
Brett Carroll tried to field the ball on one hop, but it kicked away and DeJesus scored. Then Carroll made an errant throw home, allowing Teahen to score and Brown to finish on third base.
Alex Gordon followed with another bloop hit down the third-base line, scoring Brown and giving the Royals a two-run lead.
"I think we are due a few more bloops, because we have lined out for the rest of the year so far," Teahen said. "As a team, it was nice to see a few bloop hits fall in there."
The Marlins tied the game with a two-run homer in the sixth, but Esteban German doubled home the game-winning run in the bottom of the inning.
"It was a 2-1 count and I was looking for a good pitch to hit, and that's what I got," German said.
Greinke and Dotel did the rest, but both had to work for it.
In the seventh, Greinke had a runner on third and one out, but Ryan Shealy made a diving catch on an Alfredo Amezaga grounder, kept Aaron Boone at third and tossed to Greinke for the out.
"That was the defensive play of the game," Bell said.
After Greinke tossed a scoreless eighth, Dotel made another save opportunity interesting in the ninth. Dotel put a runner in scoring position, but he struck out Carroll to end the game and seal his fifth save in five chances.
For the Royals, the win marked the first time this season they won two straight series at Kauffman Stadium -- and it provided another opportunity to show these aren't the Royals of the last few years.
"If you looked at how our team was at the beginning of the year, we should have been good," Greinke said. "And we started playing bad, like we did the last few years. But now we are starting to turn things around and play well and meet expectations."