Попробуйте:
cols=["info1", "info2"]
df[cols]=df[cols].replace(r"(.*/).*(.{5}/.*)", r"\1\2", regex=True)
Выходы:
id info1 info2
0 1 abcd/51548/1.png efgh/25698/2.png
1 2 cbhy/26988/3.png dhfy/65245/4.png
По сути, регулярное выражение будет соответствовать фрагменту до первого слова sh включительно: (.*/)
(из-за квадратных скобок) - группа 1).
Тогда для средней части - это будет соответствовать чему угодно (или ничему), затем ровно 5 символов, sla sh и снова - что угодно и ничего: .*(.{5}/.*)
. Имея снова в качестве группы (2) все, начиная с ровно 5 символов включительно.
Тогда все это будет заменено именно группой 1, за которой следует группа 2: \1\2
.