Pierwszym klubem Zapaty w karierze było Deportivo Cali, w barwach którego zawodnik zadebiutował w 2004 roku w Categoría Primera A. Miał wówczas 18 lat. W fazie Apertura zajął z zespołem 2. miejsce, natomiast w fazie Clausura miejsce 4.
Rok 2005 Zapata także rozpoczął w barwach Deportivo, a latem razem z rodakiem Abelem Aguilarem przeszedł do Udinese Calcio, grającym we włoskiejSerie A. Od razu został włączony do pierwszego składu i 19 listopada meczem z Messiną (1:0) zadebiutował w lidze, a już w drugim swoim meczu zdobył gola, a Udinese pokonało 2:0 Sampdorię. Łącznie w lidze Zapata wystąpił w 21 meczach i zdobył 1 gola, a zagrał także w 4 meczach Pucharu UEFA, z którego Udinese odpadło po meczach z Lewskim Sofia. Od początku sezonu 2006/2007 Zapata jest podstawowym zawodnikiem linii obrony Udinese.
12 lipca 2011 roku podpisał kontrakt z hiszpańskim CF Villarreal. 17 sierpnia 2011 roku zadebiutował w meczu eliminacyjnym Ligi Mistrzów przeciwko Udinese.
8 sierpnia 2012 przeniósł się do włoskiego AC Milan na zasadzie wypożyczenia z możliwością kupna. Kwota wypożyczenia to około €400 tysięcy. Założył koszulkę z numerem 17. W jego pierwszych derbach przeciwko Interowi był jednym z najlepszych zawodników i kluczowym graczem w obronie, mecz zakończył się wynikiem 1:1.
23 maja 2013 Milan potwierdził transfer definitywny Kolumbijczyka[1], a kwota transferu wyniosła około €7 milionów. Kontrakt obrońcy podpisany został do 2016 roku.