The 27-year-old Italy international's new deal takes his contract at Chelsea through to June 2022.
Zappacosta joined Chelsea from Serie A side Torino in 2017 and has made 52 appearances for the club in all competitions, although he was limited to four league matches last season.
He played 10 matches in Chelsea's triumphant Europa League campaign last season.
"I'm pleased to join Roma, after an experience overseas that helped me progress as both a player and a person," Zappacosta said in a statement on Roma's website.
Are Milan or Roma better equipped to finish top 4?
Mina Rzouki breaks down the race for fourth place in Serie A, which looks set to be a season-long battle between Milan and Roma.
"Being able to play for a great club like this is a huge motivation -- I cannot wait to start training alongside my new teammates."
Roma said that they had the option of extending Zappacosta's loan until June 2020.
"I'm pleased to be able to have Davide on my team once again," Roma sporting director Gianluca Petrachi, who worked with Zappacosta at Torino, said.
"Compared with the player that I knew at Torino, now Roma are getting a player who has matured both as a player and a person after a valuable spell in another league.
"I am certain that Davide will be able to make an important contribution during the course of the season."