在GeoPandas中为唯一用户ID创建多条LineString
为每个唯一用户ID从排序的GeoDataFrame生成LineString
没问题,这事儿其实挺简单的,咱们一步步来搞定它~
首先,得先把需要的工具备齐:导入geopandas和shapely里的LineString:
import geopandas as gpd from shapely.geometry import LineString
接下来写个小函数,用来把单个用户的所有点串成线。因为你的GeoDataFrame已经按timestamp排好序了,每个用户的点本身就是按时间顺序排列的,直接提取就行:
def user_points_to_linestring(group): # 把分组里的所有点提取成列表 point_list = list(group['geometry']) # 至少需要两个点才能生成LineString,单个点的话返回None return LineString(point_list) if len(point_list) >= 2 else None
然后是核心操作:按userid分组,把上面的函数应用到每个分组上:
# 分组生成线,同时去掉那些只有单个点的用户(返回None的情况) user_line_geoms = gdf.groupby('userid').apply(user_points_to_linestring).dropna()
最后把结果转成新的GeoDataFrame,方便后续做空间分析或者可视化:
# 构建新的GeoDataFrame,继承原数据的坐标系 line_gdf = gpd.GeoDataFrame( data={'userid': user_line_geoms.index, 'geometry': user_line_geoms.values}, crs=gdf.crs )
额外提醒
- 如果你的数据没提前按timestamp排序,记得先补这一步:
gdf = gdf.sort_values('timestamp'),不然生成的线顺序会乱掉 - 要是保留
dropna()的话,会过滤掉只有单个点的用户;如果不想过滤,去掉这个方法就行,但这类用户的geometry是None,后续操作可能会报错,建议按需选择
内容的提问来源于stack exchange,提问作者bagration
相关产品推荐
相关产品推荐

