geopandas如何新增字段存储同PC_PLANNO的其他PARCEL_SPI列表
实现方案
针对450万级别的数据量,优先推荐用高性能操作避免逐行遍历拖慢速度,以下是两种可直接落地的方案:
方案1:字典映射实现(内存占用低、适配高重复率字段场景)
# 1. 先生成PC_PLANNO到对应所有PARCEL_SPI列表的映射字典 plan_spi_map = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].agg(list).to_dict() # 2. 逐行过滤自身ID,空结果自动存None spine_copy['Same_code'] = spine_copy.apply( lambda row: [spi for spi in plan_spi_map[row['PC_PLANNO']] if spi != row['PARCEL_SPI']] or None, axis=1 )
方案2:分组transform实现(逻辑更直观)
# 1. 分组给每组所有行返回本组全部PARCEL_SPI列表 spine_copy['tmp_all_spi'] = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].transform(lambda x: [x.tolist()]*len(x)) # 2. 过滤自身ID后生成目标字段 spine_copy['Same_code'] = spine_copy.apply( lambda row: [spi for spi in row['tmp_all_spi'] if spi != row['PARCEL_SPI']] or None, axis=1 ) # 删除临时辅助列 spine_copy.drop('tmp_all_spi', axis=1, inplace=True)
优化提示
- 跑全量前建议先抽1%的小样例验证逻辑正确性,避免全量跑完发现逻辑问题浪费时间
- 如果PC_PLANNO的重复率非常高,优先选方案1,内存开销会比方案2低60%以上
- 追求极致速度可以把列表过滤逻辑改成numpy向量化操作,运行效率能提升3-5倍
内容的提问来源于stack exchange,提问作者lev72748
相关产品推荐
相关产品推荐

