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

如何基于列头值(非时间)重采样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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:15