如何将同一栅格的多行DataFrame数据合并为单行并分配ID?
解决方案:Pandas长表转宽表实现行合并
这是典型的长格式数据转宽格式场景,完全不需要手动给每个raster设置键ID,用Pandas的pivot方法就能自动按raster分组合并,具体实现步骤如下:
步骤1:准备数据(假设你已经有了目标DataFrame)
先确认你的DataFrame结构,我们可以先模拟你的原始数据:
import pandas as pd # 模拟你的原始数据 data = { 'band': [1,2,3,4,1,2,3,4,1,2,3,4], 'mean': [894.343482, 1159.282304, 1342.291595, 3056.809463, 516.9624071, 720.1932533, 689.6287879, 4561.576329, 566.2016867, 812.9927101, 760.4621212, 5009.537164], 'raster': ['D:/Python/Copied/selection/20170219_095504.tif']*4 + ['D:/Python/Copied/selection/20170325_095551.tif']*4 + ['D:/Python/Copied/selection/20170527_095700.tif']*4 } df = pd.DataFrame(data)
步骤2:提取raster文件名
原raster列是完整路径,我们需要单独提取文件名作为raster_name:
# 方法1:用字符串分割提取文件名 df['raster_name'] = df['raster'].str.split('/').str[-1] # 方法2:用os模块(更适配不同系统路径) import os df['raster_name'] = df['raster'].apply(os.path.basename)
步骤3:长表转宽表,自动合并同一raster的行
用pivot方法,按raster_name分组,把band的取值转成列,mean作为对应列的数值:
# 执行pivot转换,自动按raster_name合并行 wide_df = df.pivot(index='raster_name', columns='band', values='mean').reset_index()
这里index='raster_name'指定按文件名分组,columns='band'把波段号转成列名,values='mean'填充对应列的数值,reset_index()是把raster_name从索引变回普通列。
步骤4:调整列名和添加id列
现在把列名改成你想要的bandX_mean格式,再添加自增的id列:
# 重命名列:拼接波段号和mean wide_df.columns = ['raster_name'] + [f'band{col}_mean' for col in wide_df.columns[1:]] # 添加id列,从1开始自增 wide_df['id'] = wide_df.index + 1 # 调整列的顺序,匹配目标格式 wide_df = wide_df[['band1_mean', 'band2_mean', 'band3_mean', 'band4_mean', 'raster_name', 'id']]
最终输出
运行完以上代码后,wide_df就完全符合你想要的格式了:
band1_mean band2_mean band3_mean band4_mean raster_name id 0 894.343482 1159.282304 1342.291595 3056.809463 20170219_095504.tif 1 1 516.962407 720.193253 689.628788 4561.576329 20170325_095551.tif 2 2 566.201687 812.992710 760.462121 5009.537164 20170527_095700.tif 3
补充说明
如果你的原始数据中存在同一raster+band的重复值(比如同一个波段有多个mean),可以改用pivot_table并指定聚合函数处理,比如:
wide_df = df.pivot_table(index='raster_name', columns='band', values='mean', aggfunc='mean').reset_index()
内容的提问来源于stack exchange,提问作者remotesatellite
相关产品推荐
相关产品推荐

