Looks like you want to "match" on the city in the name column.
Write a SELECT statement first, and test that, before you convert it into a DELETE statement.
SELECT d.*
FROM table d
JOIN table k
ON k.name = d.name
AND k.population > d.population
AND k.id <> d.id
We want to keep the the rows from k, and delete the row from d.
Convert that into a DELETE statement by replacing the SELECT keyword with DELETE.
Note that if there are multiple rows with the same "highest" population for a city, this query won't identify those. To get rid of the "duplicates" with the same population value, we need a slightly different approach.
I'd use an anti-join:
SELECT d.*
FROM table d
LEFT
JOIN ( SELECT MIN(r.id) AS min_id
FROM ( SELECT t.name
, MAX(t.population) AS max_pop
FROM table t
GROUP BY t.name
) s
JOIN table r
ON r.name = s.name
AND r.population = s.max_pop
GROUP BY r.name
) q
ON q.min_id = d.id
WHERE q.min_id IS NULL
Inline view q should return a list of id values, from the rows we want to keep. Any row that has an id that isn't in that list is one we want to remove.
If MySQL balks at the table references in the inline view, we can wrap that in yet another inline view as a workaround.
SELECT d.*
FROM table d
LEFT
JOIN ( SELECT q.min_id
FROM ( SELECT MIN(r.id) AS min_id
FROM ( SELECT t.name
, MAX(t.population) AS max_pop
FROM table t
GROUP BY t.name
) s
JOIN table r
ON r.name = s.name
AND r.population = s.max_pop
GROUP BY r.name
) q
) p
ON p.min_id = d.id
WHERE p.min_id IS NULL
Convert that to a DELETE statement by replacing the outermost SELECT keyword with DELETE keyword.