The victory earned the Astros their second consecutive home series win with a game to spare. The last time the Astros won five straight was Aug. 22-26, 2010.
Norris (2-1) limited the Cardinals to one unearned run on three hits over six innings to improve to 7-2 in 11 career starts against them.
Left-hander Jaime Garcia (2-2) was charged with six runs on four hits in six innings for the Cardinals, who lost their season-worst third straight. Garcia walked four and struck out two for his second loss in as many starts.
Jed Lowrie hit a two-run home run in the eighth off Cardinals reliever J.C. Romero for the final margin. It was originally ruled an RBI double, but after a review the umpiring crew changed it to a homer after seeing the ball bounce off the railing above the yellow line over the left-field wall. It was Lowrie's fourth home run of the season.
Justin Maxwell went 2 for 3 with two doubles, an RBI, a run scored and a walk in his fourth start for the Astros since being picked up off waivers from the New York Yankees on April 8.
Johnson more than made up for a fielding error in the top of the first by taking Garcia deep on an 0-2 pitch with two outs in the bottom half to give the Astros a 4-1 lead. The slam came in Johnson's second start since he went 4 for 4 with two home runs and a career-high six RBIs in Wednesday's 8-1 win over the New York Mets.
The Cardinals got on the board first with Carlos Beltran's RBI single to right field that scored Rafael Furcal, who singled to lead off the game and reached third a batter later when Johnson failed to secure a ground ball.
Maxwell, who started at center field in place of Jordan Schafer, put the Astros ahead 5-1 with an RBI double in the fourth to plate Johnson, and Norris added a run an out later with a sacrifice fly.
After a shaky first, Norris was dominant the next three innings, at one point retiring eight in a row. He allowed three walks in the sixth, including one to David Freese with two outs to load the bases, before getting catcher Yadier Molina to ground into a forceout to end the inning.
Norris, who walked four, struck out four and drove in a run, got his first win since April 19 at Washington. The Astros improved to 5-1 with Norris as the starter.
Notes: Beltran was back in the starting lineup after pinch-hitting in Friday's 5-4 loss to the Astros. Beltran missed the previous two starts with a sore right hamstring. ... Astros RHP Rhiner Cruz was scheduled to pitch for Triple-A Oklahoma City on Saturday night and again Monday, Astros manager Brad Mills said. Cruz was placed on the disabled list retroactive to April 24 with an ankle sprain. ... Johnson's grand slam was the second by the Astros this season. Jordan Schafer hit one April 22 against Los Angeles.
Link to boxscore: Houston 8, St. Louis 2