如何基于列头值(非时间)重采样Pandas光谱DataFrame?
用Pandas实现光谱数据的波长维度降分辨率(均值聚合)
问题背景
有一个存储光谱数据的Pandas DataFrame:
- 行索引为时间戳,每行对应一条光谱
- 列名是波长值(原始分辨率10nm,列间隔10)
- 单元格值为对应波长的光谱测量值
需要将分辨率降至40nm:每4个相邻波长(如400、410、420、430)的测量值取平均,结果存入以组中点(如415)命名的列中。尝试pd.resample(axis=1, rule=40)时触发ValueError: Invalid frequency,因为该函数仅支持时间序列维度的重采样,不适用于数值型列的分组。
虚拟数据生成代码:
# 导入依赖包 import numpy as np import pandas as pd # 创建示例光谱DataFrame timestamps = pd.date_range('2023-11-07T15:00', '2023-11-07T15:10', freq='60s') wavelengths = np.arange(400, 1337, 10) dummy_spectra = np.random.rand(len(timestamps), len(wavelengths)) df_spectra = pd.DataFrame(dummy_spectra, index=timestamps, columns=wavelengths)
解决方案
通过对波长列进行分组聚合实现,核心是给每个波长分配对应的组中点标签,再按标签分组求均值:
实现代码
# 计算每个波长所属组的中点:每4个10nm间隔的波长为一组,中点=组起始波长+15 group_midpoints = (df_spectra.columns // 40) * 40 + 15 # 按组中点对列分组,计算每组的平均值 df_downsampled = df_spectra.groupby(group_midpoints, axis=1).mean() # 确保列按波长顺序排列(可选,若分组后顺序混乱时使用) df_downsampled = df_downsampled.sort_index(axis=1)
代码说明
(df_spectra.columns // 40) * 40:将波长向下取整到最近的40的倍数,以此确定每组的起始点(比如400-439的波长都会被分到400起始组)+15:得到组的中点值(400+15=415,440+15=455,完全匹配需求)groupby(axis=1).mean():沿着列方向分组,对每组内的所有波长测量值求平均,得到降分辨率后的光谱数据
结果验证
查看降分辨率后的列名,确认是否为预期的中点波长:
print(df_downsampled.columns) # 输出示例:Int64Index([415, 455, 495, ..., 1315], dtype='int64')
内容的提问来源于stack exchange,提问作者Terranees
相关产品推荐
相关产品推荐

