The Florida Marlins played sloppy defense in messy weather to wrap up an unsightly series.

A misplayed popup led to three runs and a throwing error led to three more on a rainy Sunday, helping the St. Louis Cardinals complete their first four-game series sweep on the road since 2004 by beating Florida 8-4.

"Today's loss isn't because we didn't hit," left fielder Logan Morrison said. "It isn't because we didn't pitch. It's because we didn't play defense."

Pinch hitter Corey Patterson's popup to shallow left fell for a double in the sixth inning after Morrison and shortstop Emilio Bonifacio nearly collided trying to make the catch. The Cardinals went on to score three times for a 4-2 lead.

"Those outfielders have to take charge," Marlins manager Jack McKeon said. "If you're going to be a whimp out there and not take charge, those kinds of things are going to happen."

After Florida made the score 4-all, the Cardinals took advantage of a throwing error by Bonifacio to score three unearned runs in the seventh.

"You can't give them six runs, and that's basically what we did," McKeon said. "That's too good a club to give them extra outs each inning."

It was the final game in the Marlins' current home for the Cardinals, and their record in the stadium is 45-27, best in the NL.

This season the Marlins are having trouble beating anybody in Miami, where they're 24-36. On the road they're 31-23.

"I wish I could put my finger on it," McKeon said. "It looks like we play so much more relaxed on the road. I suggest we play a few days with our road uniforms and see how that works out."

Florida was swept in a four-game series at home for the second time in two months. It also happened against Milwaukee on June 3-6.

"When you play bad baseball against a good team, that's what happens," said Florida's Javier Vazquez, who gave up four runs in six innings.

The Marlins' new ballpark opening next season will have a retractable roof, and neither the home team nor the visitors will miss dealing with South Florida's wet summer weather. The start of the game was delayed 81 minutes by rain, and drizzle fell throughout the final few innings.

About a thousand hardy fans remained until the end, and the majority seemed to be Cardinals rooters.

"You wish you didn't have delays. You wish there were more fans in the stands," St. Louis manager Tony La Russa said. "Both those things get taken care of next year."

The Cardinals' Albert Pujols hit his third home run of the series and his 27th this season, and his intentional walk backfired on the Marlins in the sixth, when Matt Holliday followed with a game-tying single.

The Marlins then intentionally walked Lance Berkman, and Jon Jay foiled that strategy with a two-run single.

Holliday said it was especially satisfying to produce after the walks.

"Mainly because you score a run and help the team," he said. "Albert is one of the greatest players of all time. I get that they're going to walk him a lot. But it does feel good when you come through."

Pujols, Holliday and Berkman combined to hit .438 (21 for 48) in the series with five home runs and 13 RBIs.

In a single series, the Cardinals matched their longest winning streak of the season.

"It's kind of unreal, really," La Russa said. "We're going to enjoy the moment."

"I'm glad they're getting out of town," McKeon said.

Florida's Bryan Petersen hit his first major league homer, a two-run shot that tied the game when he pinch-hit with two out in the sixth.

Notes: Morrison needed five stitches to repair a gash below his right knee he got chasing a foul fly. He stayed in the game and said he expects to play Monday. ... Florida SS Hanley Ramirez (left shoulder) remains sidelined indefinitely. ... Marlins 2B Omar Infante (broken finger) is expected to be healthy to play when he's eligible to come off the disabled list Aug. 20, McKeon said. ... Cardinals RHP Edwin Jackson will make his second start against the Brewers in seven days Tuesday. He gave up eight earned runs in seven innings in a 10-5 loss to them last Wednesday. ... Rookie LHP Brad Hand starts Monday against Atlanta for the Marlins, who have won his past four starts. He's 1-2 with an ERA of 2.00 in three starts at home.