Faits :
A.
A.a. A._ a été engagée en qualité d'ingénieure informatique à la direction des systèmes d'information et de communication de la Ville de Genève dès le 1 er janvier 2010. Elle avait tout d'abord un statut d'auxiliaire. Elle a ensuite été nommée employée avec effet au 1 er janvier 2011. Le 10 septembre 2014, le Conseil administratif de la Ville a ouvert à son encontre une enquête administrative. Celle-ci a été confiée à des juristes du service juridique de la Ville, qui ont rendu leur rapport le 11 mai 2015. Il ressortait notamment de celui-ci que l'employée semblait disposer des compétences techniques requises pour son poste. Il lui était toutefois reproché d'avoir adopté à plusieurs reprises un comportement inapproprié envers certains collègues et son supérieur hiérarchique, d'avoir manqué de vigilance et de contrôle dans l'exploitation des plateformes informatiques (avec une responsabilité partagée de son supérieur hiérarchique), d'avoir omis de signaler un conflit d'intérêts lors de l'élaboration du cahier des charges d'un appel d'offres et d'avoir introduit manuellement (avec toutefois la participation de son supérieur hiérarchique) des heures en sa faveur dans le système de décompte horaire, apparemment pour compenser du travail effectué pendant un congé maternité.
Le 13 mai 2015, le Conseil administratif a transmis le rapport d'enquête à A._ en l'informant qu'il envisageait de la licencier pour motif objectivement fondé. L'intéressée a pris position par écriture du 29 mai 2015. Les 23 juin et 22 juillet 2015, assistée d'une secrétaire syndicale, elle a eu des entretiens avec le directeur général de la Ville.
Par décision du 29 juillet 2015, le Conseil administratif a résilié les rapports de service de A._ avec effet au 30 novembre 2015. L'employée était libérée de son obligation de travailler jusqu'au terme du délai de congé.
A.b. Par écriture du 14 septembre 2015, A._ a recouru devant la Chambre administrative de la Cour de justice de la République et canton de Genève. Elle a contesté l'existence d'un motif de licenciement et s'est plainte d'avoir été licenciée sans avoir été entendue par une délégation de l'exécutif communal. Statuant le 24 novembre 2015, la Chambre administrative a constaté la nullité de la décision du 29 juillet 2015, au motif que l'employée n'avait pas été entendue par une délégation du Conseil administratif composée d'au moins un membre de cette autorité.
Saisi d'un recours en matière de droit public de la Ville de Genève, le Tribunal fédéral l'a admis par arrêt du 18 novembre 2016 (cause 8C_20/2016) et a annulé le jugement cantonal, considérant que A._ avait été valablement entendue avant le prononcé de son licenciement. Aussi la cause a-t-elle été renvoyée à la Chambre administrative pour qu'elle statue à nouveau et se prononce sur l'existence d'un motif fondé de licenciement.
B.
Par jugement du 28 mai 2019, la Chambre administrative a rendu un nouveau jugement, par lequel elle a admis partiellement le recours formé contre la décision de résiliation des rapports de service. Elle a constaté que le licenciement était contraire au droit et qu'une réintégration n'était pas possible. Aussi a-t-elle alloué à A._, à la charge de la Ville de Genève, une indemnité, non soumise aux déductions des cotisations sociales, correspondant à 4 mois de son dernier traitement brut, comprenant le treizième salaire au prorata du nombre de mois fixés, à l'exclusion de tout autre élément de rémunération.
C.
A._ forme un recours en matière de droit public contre ce jugement dont elle demande l'annulation, en concluant principalement à sa réintégration ou au renvoi de la cause à l'instance précédente pour que celle-ci ordonne sa réintégration. Subsidiairement, elle demande que l'indemnité soit fixée à 24 mois de son dernier traitement brut ou que la cause soit renvoyée pour nouvelle décision dans ce sens.
La Ville de Genève conclut à l'irrecevabilité du recours, subsidiairement à son rejet. La recourante a répliqué et a maintenu ses conclusions.
La juridiction cantonale a renoncé à déposer des observations sur le recours.

Considérant en droit :
1.
1.1. Le jugement entrepris a été rendu en matière de rapports de travail de droit public au sens de l'art. 83 let. g LTF. Dans la mesure où la contestation porte sur la résiliation de ces rapports, il s'agit d'une contestation de nature pécuniaire, de sorte que le motif d'exclusion de l'art. 83 let. g LTF n'entre pas en considération. La valeur litigieuse atteint par ailleurs le seuil de 15'000 fr. ouvrant la voie du recours en matière de droit public en ce domaine (art. 51 al. 2 et 85 al. 1 let. b LTF).
1.2. L'intimée soutient que la recourante n'a pas d'intérêt actuel à recourir, au motif qu'elle aurait retrouvé un travail, ce que conteste la recourante dans sa réplique. Le moyen n'est pas fondé. Le Tribunal fédéral a eu l'occasion de confirmer dans un arrêt du 17 août 2015 la nouvelle jurisprudence développée par la Cour de justice genevoise, selon laquelle la reprise d'une activité professionnelle n'entraîne plus l'impossibilité pour un employé (cantonal) licencié de demander sa réintégration ou une indemnité en cas de refus mais constitue un élément qui pourrait être pris en considération dans la fixation du montant de l'indemnité (cf. arrêt 8C_421/2014 du 17 août 2015 consid. 3.4.2). Sous l'empire des anciennes dispositions de la loi fédérale du 24 mars 2000 sur le personnel de la Confédération (LPers; RS 172. 220.1) - qui conféraient un droit à la réintégration -, le Tribunal fédéral a jugé que ce droit pouvait être exercé même si l'employé avait retrouvé entre-temps un nouvel emploi (arrêt 8C_808/2010 du 28 juin 2011 consid. 5). En d'autres termes, un employé est réintégrable même dans cette éventualité. Enfin, indépendamment de la situation professionnelle actuelle de la recourante, qui n'est pas établie, celle-ci dispose dans tous les cas d'un intérêt à recourir contre le montant de l'indemnité allouée au titre de son licenciement contraire au droit.
1.3. Pour le surplus, interjeté en temps utile et dans les formes requises contre une décision finale prise par un tribunal cantonal, le recours respecte a priori les exigences des art. 42, 86 al. 1 let. d, 90, 100 al. 1 et 106 al. 2 LTF. Il convient, en conséquence, d'entrer en matière.
2.
2.1. Le Tribunal fédéral conduit son raisonnement juridique sur la base des faits établis par l'autorité précédente (<ref-law>). Il ne peut s'en écarter que si les faits ont été établis de façon manifestement inexacte - notion qui correspond à celle d'arbitraire au sens de l'art. 9 Cst. (<ref-ruling> consid. 2 p. 190) - ou en violation du droit au sens de l'<ref-law> (<ref-law>), et pour autant que la correction du vice soit susceptible d'influer sur le sort de la cause (<ref-law>). Il n'entre pas en matière sur des critiques appellatoires portant sur l'appréciation des preuves ou l'établissement des faits par l'autorité précédente (<ref-ruling> consid. 2 p. 215; <ref-ruling> consid. 2.3 p. 266; <ref-ruling> consid. 5.1 p. 356).
2.2. Sauf exceptions non pertinentes en l'espèce (cf. art. 95 let. c, d et e LTF), on ne peut pas invoquer la violation du droit cantonal ou communal en tant que tel devant le Tribunal fédéral (<ref-law> a contrario). Il est néanmoins possible de faire valoir que son application consacre une violation du droit fédéral, en particulier la protection contre l'arbitraire (art. 9 Cst.) ou la garantie d'autres droits constitutionnels. Le Tribunal fédéral n'examine alors de tels moyens que s'ils sont formulés conformément aux exigences de motivation qualifiée prévues à l'<ref-law> (<ref-ruling> consid. 3.2 p. 579 et la référence). Appelé à revoir l'interprétation d'une norme cantonale ou communale sous l'angle de l'arbitraire, le Tribunal fédéral ne s'écarte de la solution retenue par l'autorité cantonale de dernière instance que si celle-ci apparaît insoutenable, en contradiction manifeste avec la situation effective, adoptée sans motifs objectifs et en violation d'un droit certain. En revanche, si l'application de la loi défendue par l'autorité cantonale ne s'avère pas déraisonnable ou manifestement contraire au sens et au but de la disposition ou de la législation en cause, cette interprétation sera confirmée, même si une autre solution - même préférable - paraît possible. En outre, pour qu'une décision soit annulée au titre de l'arbitraire, il ne suffit pas qu'elle se fonde sur une motivation insoutenable; encore faut-il qu'elle apparaisse arbitraire dans son résultat (<ref-ruling> consid. 7.1 p. 124).
3.
3.1. Selon l'art. 34 al. 1 du Statut du personnel du 29 juin 2010 de la Ville de Genève (LC 21 151; ci-après: le Statut), après la période d'essai, un employé ou une employée peut être licenciée, par décision motivée du Conseil administratif, pour motif objectivement fondé pour la fin d'un mois, moyennant le respect d'un délai de préavis variable en fonction du nombre d'années de service. Aux termes de l'art. 34 al. 2 du Statut, le licenciement est contraire au droit s'il est abusif au sens de l'<ref-law> ou s'il ne repose pas sur un motif objectivement fondé; est considéré comme objectivement fondé tout motif dûment constaté démontrant que les rapports de service ne peuvent pas se poursuivre en raison notamment de l'insuffisance des prestations (let. a), d'un manquement grave ou répété aux devoirs de service (let. b) ou de l'inaptitude à remplir les exigences du poste (let. c), la loi prévoyant encore trois autres motifs non pertinents en l'espèce.
3.2. Les conséquences d'un licenciement contraire au droit, abusif ou sans juste motif sont prévues aux art. 105 et 106 du Statut, dont la teneur est la suivante:
"Art. 105 Conséquences d'un licenciement contraire au droit
1 Si la chambre administrative de la Cour de justice retient qu'un licenciement est contraire au droit, elle peut proposer au Conseil administratif la réintégration de la personne intéressée. D'un commun accord, les parties peuvent convenir d'un transfert de la personne intéressée dans un poste similaire.
2 En cas de refus du Conseil administratif, la chambre administrative de la Cour de justice alloue à la personne intéressée une indemnité dont le montant ne peut être inférieur à 3 mois et supérieur à 24 mois du dernier traitement brut.
3 En lieu et place de la réintégration, la personne intéressée peut demander le versement d'une indemnité. La chambre administrative de la Cour de justice alloue à la personne intéressée une indemnité dont le montant se calcule comme suit:
a) en cas de licenciement immédiat sans juste motif (art. 30 du statut), l'indemnité s'élève au montant que la personne intéressée aurait gagné si les rapports de service avaient pris fin à l'échéance du délai de congé ou de la durée déterminée fixée dans le contrat, sous imputation des revenus que la personne intéressée a réalisés pendant cette période ou auxquels elle a intentionnellement renoncé; s'y ajoute un montant supplémentaire qui ne peut être inférieur à 3 mois et supérieur à 12 mois du dernier traitement brut,
b) dans les autres cas, y compris en cas de licenciement abusif, l'indemnité s'élève à un montant qui ne peut être inférieur à 3 mois et supérieur à 12 mois du dernier traitement brut.
Art. 106 Conséquences d'un licenciement abusif ou sans juste motif
En dérogation avec (sic) l'article 105, lorsque le licenciement contraire au droit est également abusif au sens de l'article 336 du Code des obligations (CO) ou des articles 3 ou 10 de la loi sur l'égalité entre femmes et hommes (LEg) ou sans juste motif au sens de l'article 30, la chambre administrative de la Cour de justice annule le licenciement et ordonne la réintégration de la personne intéressée."
4.
4.1. Par un grief de nature formelle qu'il convient d'examiner en premier lieu (<ref-ruling> consid. 2.2 p. 500 et les références), la recourante reproche à la cour cantonale d'avoir violé son droit d'être entendue (art. 29 al. 2 Cst.) en considérant que l'intimée avait valablement manifesté son refus de la réintégrer. A l'appui de ce grief, elle fait valoir que les écritures déposées par l'intimée en instance cantonale émanaient de représentants de la direction générale de la Ville et non de l'autorité d'engagement, soit du Conseil administratif. En outre, de l'avis de la recourante, l'intimée ne pouvait pas valablement se prononcer sur la question de la réintégration avant de connaître l'avis des premiers juges sur les motifs invoqués à l'appui du licenciement.
4.2. Telle qu'elle est invoquée, la violation du droit d'être entendu semble davantage concerner l'intimée, en particulier le Conseil administratif, que la recourante. Quoi qu'il en soit, non seulement l'intimée n'a pas recouru contre le jugement cantonal mais elle a encore confirmé son refus de réintégrer la recourante dans la présente procédure, tout en contestant que le refus manifesté devant l'autorité précédente n'émanât pas du Conseil administratif. En procédure cantonale, elle indiquait en outre, dans son mémoire du 27 février 2017, qu'en tout état de cause, il était exclu que la recourante puisse être réintégrée sans que cela cause de nombreux problèmes quant à l'organisation et au bon fonctionnement du service. Dans ces conditions, on ne voit pas en quoi la juridiction cantonale aurait violé le droit d'être entendue de la recourante ou procédé à un établissement arbitraire des faits - invoqué en passant par la recourante - en considérant que l'intimée s'opposait à toute réintégration si le licenciement était jugé contraire au droit.
5.
Examinant le bien-fondé des quatre motifs invoqués à l'appui du licenciement, la cour cantonale a considéré que seuls deux reproches étaient partiellement bien fondés. Premièrement, la recourante avait tenu des propos inadéquats en traitant un collègue de travail, B._, de "roi des blaireaux" et en lui adressant un courriel, transmis en copie à leurs responsables hiérarchiques respectifs, dans lequel elle indiquait qu'il était insignifiant et manquait d'éducation. Les premiers juges ont néanmoins souligné que les propos étaient relativement anciens et que le comportement de B._ n'était pas non plus irréprochable. Deuxièmement, un rapport d'audit de la société C._ du 16 janvier 2014 avait mis en évidence l'existence de failles liées à la configuration par défaut de certains "périmètres systèmes". Or il ressortait du cahier des charges de la recourante et de ses propres déclarations que ce type de paramétrage relevait clairement de sa responsabilité. La recourante avait ainsi commis des erreurs relatives au paramétrage de certains systèmes. Le reproche fait par l'intimée d'avoir laissé les plateformes de la Ville dans un état critique de vulnérabilité, en raison de configurations contraires aux règles de bonne pratique, était sur ce point bien fondé. Selon la juridiction cantonale, ces éléments n'étaient toutefois pas constitutifs de manquements graves ou répétés aux devoirs de service au sens de l'art. 34 al. 2 let. b du Statut, de sorte que le licenciement était contraire au droit.
6.
6.1. La recourante se plaint d'arbitraire dans l'établissement des faits et dans l'application de l'art. 34 du Statut. Elle reproche à la juridiction cantonale d'avoir considéré que les propos tenus à l'encontre de B._ étaient inadéquats au vu des circonstances, dès lors que ce dernier avait aussi tenu des propos et eu des gestes inappropriés. La recourante fait également valoir qu'elle était enceinte au moment des faits - ce que la cour cantonale aurait omis de constater - et se trouvait alors dans un état qui "d'ordinaire peut influer sur la capacité à faire face à des attitudes telles que celles adoptées par B._". Elle soutient ensuite que les premiers juges se sont contredits en lui reprochant des erreurs dans le paramétrage de certains systèmes tout en considérant que les éléments au dossier ne permettaient pas d'établir sa responsabilité dans l'existence et l'absence d'identification de failles relevées par le rapport d'audit. En définitive, la recourante considère qu'aucun manquement ne peut, même en partie, lui être imputé. Elle en déduit, dans un moyen subséquent qui sera examiné plus loin (cf. consid. 7.2.1 infra), que son licenciement doit être qualifié d'abusif.
6.2. Ces griefs sont mal fondés. En effet, les premiers juges ont tenu compte dans leur appréciation des tensions alors existantes entre la recourante et son collègue, auquel ils ont également reproché des propos inadéquats (p. ex. "casse-toi", "fous le camp"). Les circonstances invoquées par la recourante sur ce sujet, dans une discussion largement appellatoire, ne permettent en tout cas pas de considérer que de tels échanges auraient leur place dans un contexte professionnel. Quant au second reproche admis par la cour cantonale, il a trait à des erreurs dans la configuration de certains "périmètres systèmes". Il ne se confond toutefois pas avec la question de la responsabilité de la recourante - dont la cour cantonale a admis qu'elle n'était pas engagée - pour n'avoir pas identifié les failles mises en évidence par le rapport d'audit, quand bien même ces failles porteraient sur le même environnement que les configurations mises en cause. En tant qu'elle se plaint d'un manque de motivation à cet égard, la critique de la recourante est dès lors sans fondement.
7.
7.1. Sous couvert d'arbitraire dans l'établissement des faits et dans l'application des art. 105 et 106 du Statut, ainsi que de violation du principe de la proportionnalité, la recourante conteste n'avoir pas démontré l'existence d'un licenciement abusif au sens de l'<ref-law>. Elle invoque la mauvaise foi de l'intimée, se prévalant des motifs de licenciement écartés par les juges cantonaux ainsi que du jugement cantonal du 24 novembre 2015. La recourante reproche ensuite à la juridiction cantonale de n'avoir pas dûment interpellé le Conseil administratif sur la possibilité d'une réintégration et d'avoir considéré à tort que l'indemnité maximale à laquelle elle pouvait prétendre ascendait à douze mois de traitement.
7.2.
7.2.1. En l'espèce, la cour cantonale a retenu que la recourante n'avait apporté aucun élément probant pour étayer son point de vue selon lequel son licenciement était lié au fait d'avoir eu à coeur, tout en s'investissant dans ses tâches, de faire respecter ses droits en se manifestant. La recourante ne démontre pas en quoi ces considérations relèveraient d'un établissement arbitraire des faits. Certes, elle soutient qu'il appartenait aux juges cantonaux d'instruire d'office la question en application de la maxime inquisitoire. A supposer qu'elle soulève ici un grief supplémentaire, force est de constater que celui-ci porterait sur du droit cantonal et qu'il ne fait l'objet d'aucune motivation répondant aux exigences des art. 42 al. 2 et 106 al. 2 LTF. Par ailleurs, la recourante ne saurait inférer la mauvaise foi de l'intimée du premier jugement cantonal du 24 novembre 2015, lequel a été annulé par le Tribunal fédéral (cause 8C_20/2016). S'il est vrai que, dans son nouveau jugement, la juridiction cantonale a mis en doute la bonne foi de l'intimée en particulier en rapport avec une problématique de conflit d'intérêts, on ne peut toutefois pas en conclure que le congé n'aurait été justifié que par de simples prétextes ou par la volonté de faire supporter à la recourante certaines carences de sa hiérarchie. En tout cas, il n'y a rien d'arbitraire à considérer qu'un licenciement n'est pas abusif lorsqu'une partie des manquements à son origine sont établis, même si ceux-ci ne sont pas suffisamment graves pour justifier le congé. On relèvera d'ailleurs que, selon la jurisprudence, le congé ne peut pas être considéré comme abusif sur la seule base du caractère non avéré des griefs invoqués à l'appui de la résiliation (arrêt 4A_346/2009 du 20 octobre 2009 consid. 3.2 et les références). Par conséquent, la recourante échoue à démontrer que les premiers juges étaient tenus d'ordonner sa réintégration en application de l'art. 106 du Statut.
7.2.2. C'est de même à tort que la recourante reproche aux premiers juges d'avoir fait une application arbitraire du droit communal en considérant qu'une proposition de réintégration au sens de l'art. 105 al. 1 du Statut n'entrait pas en ligne de compte. En effet, la disposition en question est de nature potestative, de sorte qu'elle confère un certain pouvoir d'appréciation au juge. En outre, comme on l'a vu (cf. consid. 4.2 supra), l'intimée avait manifesté son refus de réintégrer la recourante indépendamment de l'issue du litige sur le bien-fondé du licenciement. Les juges cantonaux pouvaient donc, sans verser dans l'arbitraire, renoncer à proposer la réintégration de la recourante au Conseil administratif.
7.2.3. En ce qui concerne finalement la fixation de l'indemnité, la cour cantonale a tenu compte du caractère matériellement infondé du licenciement, de la durée des rapports de travail (six ans), de l'âge de la recourante au moment de son licenciement (40 ans) et de l'existence de deux griefs partiellement fondés à son encontre. Aussi a-t-elle fixé l'indemnité pour licenciement contraire au droit à quatre mois "sur les douze maximums prévus". En l'occurrence, il ressort de l'art. 105 du Statut que l'al. 1 prévoit la possibilité pour la Chambre administrative de proposer la réintégration de l'employé licencié au Conseil administratif, que l'al. 2 fixe l'étendue de l'indemnité à allouer en cas de refus du Conseil administratif et que l'al. 3 règle la quotité de l'indemnité que l'employé peut demander en lieu et place de la réintégration (cf. consid. 3.2 supra). Comme les premiers juges ont renoncé à proposer la réintégration de la recourante et que celle-ci avait conclu subsidiairement à l'octroi d'une indemnité, on peut penser qu'ils ont fixé l'indemnité sur la base de l'art. 105 al. 3 (let. b) du Statut - lequel prévoit un seuil maximal de douze mois - plutôt que de l'al. 2, comme le soutient la recourante. La question peut toutefois demeurer indécise en l'espèce. En effet, il ne ressort pas du jugement attaqué que l'indemnité devait correspondre à un tiers du plafond légal. En outre, même à suivre le point de vue de la recourante, l'indemnité s'inscrit dans les limites définies par l'art. 105 al. 2 du Statut et les circonstances prises en compte par l'autorité précédente pouvaient justifier qu'elle se situe dans le bas de la fourchette. Dans son résultat, le montant de l'indemnité allouée n'apparaît donc pas arbitraire.
8.
Vu ce qui précède, le recours est en tous points mal fondé et doit être rejeté.
La recourante, qui succombe, supportera les frais judiciaires (<ref-law>). Bien qu'elle obtienne gain de cause, l'intimée n'a pas droit à des dépens (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 3'000 fr., sont mis à la charge de la recourante.
3.
Le présent arrêt est communiqué aux parties et à la Chambre administrative de la Cour de justice de la République et canton de Genève.
Lucerne, le 21 janvier 2020
Au nom de la Ire Cour de droit social
du Tribunal fédéral suisse
Le Président : Maillard
La Greffière : Castella