You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将同一栅格的多行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:50:09