"He had great life on the ball inside, obviously he hides it well and he was throwing a great sinker," Rolen said. "We were kind of happy to see him go after seven.
"I think he would have gone out for the eighth if they didn't score, and maybe it worked out better for us."
St. Louis, which reopened a five-game lead over second-place Cincinnati in the NL Central, sent the Marlins to their second consecutive loss following a nine-game winning streak. After losing 14 of their first 22 games in August while their lead shrunk to one percentage point, the Cardinals won five of their final six.
"We haven't been as consistent as we have obviously for the last couple of years, but this is a different team," Rolen said. "We're five games up right now and that's a good spot to be when the sky was falling a week ago."
Despite Willis' strong outing Florida dropped three games back of NL wild-card leader San Diego.
Pinch-hitter Miguel Olivo's bases-loaded infield hit off Braden Looper (8-1) put Florida ahead 2-1 in the eighth. Olivo, one of the fastest-running catchers in the majors, had been in an 0-for-15 slump before his slow dribbler down the third-base line.
Without that hit, Willis would have come back out for the eighth despite throwing 108 pitches.
"I'm used to having high pitch counts and this is no different," Willis said. "We had to get some bats in there and I was struggling at the plate, so I felt Skip made the right call."
Sergio Mitre (1-5) relieved Willis to start the bottom half, and Duncan hit his first pitch over the right-field wall, a drive estimated at 428 feet. It was his third pinch homer, his second this season.
"I wanted to be really aggressive and I wanted to hit the first fastball that was in the strike zone," Duncan said. "He tried to get ahead with a fastball and he left it over the plate."
In Mitre's six previous relief appearances, he had not allowed a run in six innings. But in two appearances against the Cardinals he has allowed 10 runs in 4 1/3 innings.
Albert Pujols walked, took third when Mitre threw wildly to first for an error on a pickoff attempt, then scored on Rolen's single. Juan Encarnacion doubled to chase Mitre, Ronnie Belliard added a run-scoring single off Taylor Tankersley and pinch-hitter Scott Spiezio hit a sacrifice fly.
Jason Isringhausen recorded three outs for his 32nd save in 41 chances.
Cardinals starter Jeff Suppan allowed one run and six hits in seven innings and has give up one run in his last two starts, a span of 14 2/3 innings.
"I think you have quicker innings, I think you have a better rhythm," Suppan said. "I think when you're pitching well, you can feel it."
Willis gave up a run and six hits in seven innings.
Alfredo Amezaga homered in the first and had three hits for the Marlins. The Cardinals tied it in the fourth on Aaron Miles' single.
- Hanley Ramirez, who is among the league leaders with 42 steals, was thrown out for the 10th time -- on a pitchout in the third by Yadier Molina. He stole successfully in the seventh to beat a one-hop throw.
- Molina missed the previous five starts due to an elbow injury.
- The Marlins were without Miguel Cabrera, among the league leaders with 99 RBI. Cabrera, who was hit on the left biceps by a pitch Wednesday, is day to day.
- The Cardinals' Jose Vizcaino is 2-for-22 as a pinch hitter after taking a called third strike in the seventh.
- Looper's victory total is two more than his previous career best, in 2003 with Florida.
- The Marlins fell to 12-2 in series finales since the All-Star break.