You can spatial join the dataframe to itself, intersect, the output will be the lines where two polygons share a border, and measure length: import geopandas as gpd import numpy as np df = gpd.read_file(r"/home/bera/Desktop/GIStest/shared_length.shp") # id geometry # 0 1 POLYGON ((594912.796 7238961.152, 596731.160 7... # 1 2 POLYGON ((594912.796 7238961.152, 595300.862 7... # 2 3 POLYGON ((595300.862 7239216.167, 594912.796 7... # 3 4 POLYGON ((598039.495 7240524.502, 598294.510 7... df["geombackup"] = df.geometry sj = gpd.sjoin(df[["id","geometry"]], df[["id","geombackup","geometry"]], how="left", predicate="intersects") # sj[["id_left","id_right","geombackup"]].head() # id_left id_right geombackup # 0 1 1 POLYGON ((594912.796 7238961.152, 596731.160 7... # 0 1 2 POLYGON ((594912.796 7238961.152, 595300.862 7... # 0 1 3 POLYGON ((595300.862 7239216.167, 594912.796 7... # 1 2 1 POLYGON ((594912.796 7238961.152, 596731.160 7... # 1 2 2 POLYGON ((594912.796 7238961.152, 595300.862 7... #Drop self joins, like the first row above sj = sj.loc[sj["id_left"]!=sj["id_right"]] #Drop duplicates, like the second row is the same as 4th. 1-2 and 2-1. https://stackoverflow.com/questions/55480504/efficient-way-in-pandas-for-removing-columns-with-duplicate-values-in-different mask = gpd.pd.DataFrame(np.sort(sj[["id_left","id_right"]].values, axis=1)).duplicated().to_list() sj = sj[[not x for x in mask]] sj["borderline"] = sj.apply(lambda x: x["geometry"].intersection(x["geombackup"]), axis=1) # sj[["id_left","id_right","borderline"]].head(1) # id_left id_right borderline # 0 1 2 LINESTRING (594912.796 7238961.152, 596731.160... sj["borderlength"] = sj["borderline"].length sj = sj.set_geometry(col="borderline", crs=df.crs).drop(columns=["geometry","geombackup"]) sj.to_file(r"/home/bera/Desktop/GIStest/shared_borders.shp") [![enter image description here][1]][1] [1]: https://i.sstatic.net/Ym32I.png