You can summarize the data by panel and add point and line layers for the summarized data. In the code below, I've put the summarized data into the main ggplot call to avoid having to run the code twice (once for each geom that uses the data) and moved the original data frame into the first call to geom_point. The addition of group=city in the first call to geom_point is to avoid a .group not found error.
ggplot(df %>% group_by(region, age, year) %>%
summarise(population=mean(population)),
aes(x = year, y = population)) +
geom_point(data=df, aes(color=city, group=city), size=4) +
facet_grid(age~region) +
geom_line(colour="blue", linetype="11", size=0.3) +
geom_point(shape=4, colour="blue", size=3)

Evidently my brain isn't firing on all cylinders today. You can do this more easily by using stat_summary. In the code below, group=1 overrides the by-city grouping so that we get a mean across all cities within each year, rather than the mean of each individual city within each year (which is the same as the individual observations in this case).
ggplot(df, aes(x = year, y = population, colour=city)) +
geom_point(size=4) +
facet_grid(age~region) +
stat_summary(fun.y=mean, aes(group=1), geom="line", colour="blue") +
stat_summary(fun.y=mean, aes(group=1), geom="point", colour="blue", size=3, shape=4)
In reference to your comment below, even though we were able to use stat_summary here, for more complex cases, keep in mind that you can always add layers with transformations of the data or layers that use completely different data. You just need to make sure that you set the aesthetics within each layer to use the appropriate data columns.