Pandas中非时间序列深度数据下采样(降低采样率)的最优实现方法
Pandas非时间序列固定间隔下采样方案
完全可行,pandas.resample确实仅支持时间类索引,针对深度这类数值型间隔的下采样需求,用Pandas自带的分组聚合即可实现,不需要写循环,性能远高于自定义遍历逻辑。
方案1:数据深度连续无缺失时使用(你的场景适用)
你的采样步长固定为0.01m,直接用深度的整数除法完成5m区间分组即可,代码如下:
import pandas as pd # 定义下采样间隔 interval = 5 # 按5m区间分组聚合 df_downsampled = df_raw.groupby(df_raw["Depth_m"] // interval).agg( # 深度取每组的平均深度,和你给出的期望输出规则一致 Depth_m = ("Depth_m", "mean"), # 数值取每组的平均值,也可替换为median、max、min等你需要的聚合规则 value = ("value", "mean") ).reset_index(drop=True)
规则说明:
df_raw["Depth_m"] // interval会自动把所有深度映射到所属的5m区间编号,比如1.344.99m的样本都属于0号区间,5.009.99m属于1号区间,以此类推自动完成分组- 如果你不需要平均深度,想取每组第一个/最后一个样本的深度,或者固定取区间中点作为深度值,直接修改
Depth_m对应的聚合函数即可,比如取每组最后一个样本的所有值可以直接简化为df_downsampled = df_raw.groupby(df_raw["Depth_m"] // interval).last().reset_index(drop=True)
方案2:深度存在缺失/需要自定义分箱边界时使用
如果你的原始数据存在深度跳变、漏采的情况,可以用pd.cut手动定义分箱规则,适配性更强:
import pandas as pd interval = 5 # 生成从最小深度到最大深度的5m间隔分箱边界 bins = pd.interval_range( start = df_raw["Depth_m"].min(), end = df_raw["Depth_m"].max() + interval, freq = interval, closed = "left" ) # 给每个样本标记所属分箱 df_raw["depth_bin"] = pd.cut(df_raw["Depth_m"], bins=bins) # 分组聚合 df_downsampled = df_raw.groupby("depth_bin", observed=True).agg( Depth_m = ("Depth_m", "mean"), value = ("value", "mean") ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

