The methodology is called linear referencing and a solution was given by Mike T in Coordinate of the closest point on a line with Shapely.
There is also a recipe in the Python Geospatial Analysis Cookbook (Snapping a point to the nearest line
)
"This super common spatial task is for all the GPS junkies who want their GPS coordinates to snap to an existing road" ...
The problem:

import geopandas as gpd
gdf_segments = gpd.read_file("line.shp")
shply_line = gdf_segments.geometry.unary_union
point = gpd.read_file('points.shp')
point.crs
{'init': 'epsg:4326'}
# reproject the points
point = point.to_crs(gdf_segments.crs)
print(point)
id geometry
0 1 POINT (165.2232667307835 -581.6023098314181)
1 2 POINT (458.0395231332805 -626.3180927932262)
2 3 POINT (807.1111194563855 -509.4800791162997)
3 4 POINT (1019.150477463845 -1181.659268662333)
4 5 POINT (74.34925616221153 -244.0702704396099)
5 6 POINT (19.53636085704784 -383.9873978914693)
Solution with linear referencing:
for i in range(len(point)):
print(shply_line.interpolate(shply_line.project( point.geometry[i])).wkt)
POINT (158.2568242503091 -613.1561963606259)
POINT (433.554325720973 -616.258892163531)
POINT (828.8651101528822 -533.8813967264118)
POINT (981.8579545397143 -1193.379775867061)
POINT (74.34925616221147 -233.4585492227979)
POINT (18.88030104343747 -405.9654016474183)
New GeoDataFrame with results:
result = point.copy()
result['geometry'] = result.apply(lambda row: shply_line.interpolate(shply_line.project( row.geometry)), axis=1)
print(result)
id geometry
0 1 POINT (158.2568242503091 -613.1561963606259)
1 2 POINT (433.554325720973 -616.258892163531)
2 3 POINT (828.8651101528822 -533.8813967264118)
3 4 POINT (981.8579545397143 -1193.379775867061)
4 5 POINT (74.34925616221147 -233.4585492227979)
5 6 POINT (18.88030104343747 -405.9654016474183)
result.to_file("new_points.shp")

NEW
Buffer the lines (45m)
buff = shply_line.buffer(45)
Select the points within 45m (point in polygon):
from geopandas.tools import sjoin
buff = gpd.GeoDataFrame( geometry=[buff])
pointInPolys = sjoin(point,buff, how='left')
pointInPolys
id geometry index_right
0 1 POINT (165.2232667307835 -581.6023098314181) NaN
1 2 POINT (458.0395231332805 -626.3180927932262) 0.0
2 3 POINT (807.1111194563855 -509.4800791162997) NaN
3 4 POINT (1019.150477463845 -1181.659268662333) NaN
4 5 POINT (74.34925616221153 -244.0702704396099) 0.0
5 6 POINT (19.53636085704784 -383.9873978914693) 0.0
point45 = pointInPolys.dropna()
point45
id geometry index_right
1 2 POINT (458.0395231332805 -626.3180927932262) 0.0
4 5 POINT (74.34925616221153 -244.0702704396099) 0.0
5 6 POINT (19.53636085704784 -383.9873978914693) 0.0
result2 = point45.copy()
result2['geometry'] = result2.apply(lambda row: shply_line.interpolate(shply_line.project( row.geometry)), axis=1)
print(result2)
id geometry index_right
1 2 POINT (433.554325720973 -616.258892163531) 0.0
4 5 POINT (74.34925616221147 -233.4585492227979) 0.0
5 6 POINT (18.88030104343747 -405.9654016474183) 0.0
Points in Green
