Sí, por eso decía que sirve solo si sabes seguro que cada ciudad va a estar en algún país (y en un único país).
Si no se cumplen las condiciones es mejor dejar de hacerlo en una única linea y hacer la función aparte. Por ejemplo, el siguiente código devuelve "No identificado" si la ciudad no aparece en el df de los paises, el nombre de la ciudad si corresponde a un único país, y una cadena con todos los paises que tienen una ciudad con ese nombre, separados con ' - ', en caso de que haya más de uno. Puedes modificar la función para que te lo saque a tu gusto, con otro formato o que ponga otra cosa en vez de "No identificado", etc.
def identifica_pais(ciudad, df_paises):
paises = df_paises[df_paises["Ciudades"].str.contains(ciudad)]["Pais"]
if len(paises) == 0:
return "No identificado"
else:
return ' - '.join(paises.tolist())
df1["Pais"] = df1["Ciudad"].apply(lambda x: identifica_pais(x, df2))