Como las geopandas no pueden realizar la superposición/intersección con las líneas, he encontrado una solución:
import geopandas as gpd
import fiona
from shapely.geometry import shape, MultiPolygon, LineString, MultiLineString
lines = gpd.read_file('lines.shp')
polyons= gpd.read_file('polygons.shp')
pol_f = fiona.open('polygons.shp')
pol_shp = MultiPolygon([shape(x["geometry"]) for x in pol_f])
lines2 = lines.geometry.apply(lambda x: x.intersection(pol_shp))
lines2.to_file('lines_int.shp')
Pero no me deja porque hay las geometrías vacías son GeometryCollections.
He intentado filtrar esto, pero no funciona.
lines3 = lines2[lines2.geometry != np.nan]
lines3 = lines2[lines2.geometry == LineString]
lines3 = lines2[lines2.geometry == LineString()]
lines3 = lines2[lines2.geometry == MultiLineString()]
lines3 = lines2[lines2.geometry == MultiLineString]
lines3 = lines2[lines2.geometry != GeometryCollection]
¿Alguna idea?