Keuchel (9-3) issued one walk while recording his second shutout of the season. The left-hander has now gone at least six innings in 27 consecutive starts.
Evan Gattis drove in two runs and Jose Altuve went 3-for-4 with three runs scored and two stolen bases.
New York starter Adam Warren (5-5) allowed three runs -- two earned -- on five hits over 5 2/3 innings.
The Astros gave Keuchel all the support he would need in the second inning. Colby Rasmus reached on a fielder's choice and raced home on Preston Tucker's double to left.
Altuve scored again in the sixth after he reached on an infield single, stole second, advanced to third on catcher John Ryan Murphy's throwing error and raced home on Gattis' single.
The Astros plated one run in the eighth. Altuve doubled and stole third before Valbuena walked. Gattis followed with an RBI double to left, but Valbuena was thrown out at home.
Keuchel retired 15 straight batters before loading the bases with two outs in the ninth. He got Jose Pirela to ground into a fielder's choice to end the game.
It was Keuchel's third complete game of the season ... The Astros came to terms with LSU shortstop Alex Bregman, the No. 2 pick from this month's MLB draft ... New York started a seven-game road trip, while Houston began a seven-game homestand.