Pandas时间序列按日分组随机采样:处理样本不足及返回原DataFrame
解决方案
要实现每日随机采样且保留原DataFrame结构,可按以下方式修改代码:
核心代码
sampled_df = df.groupby(pd.Grouper(key='time', freq='D')).apply( lambda x: x.sample(n=min(len(x), 10)) if len(x) > 0 else pd.DataFrame(columns=df.columns) ).reset_index(drop=True)
代码说明
- 分组对象调整:直接对整个DataFrame按日期分组,而非仅针对
temperature列,确保采样后保留所有原始列数据。 - 采样逻辑处理:
- 对每个日期分组,先判断是否有数据:有数据时取
min(分组长度, 10)个随机样本,自动满足"≥10取10,不足取全部"的需求; - 无数据的分组返回与原DataFrame列名一致的空DataFrame,避免触发采样报错。
- 对每个日期分组,先判断是否有数据:有数据时取
- 索引重置:通过
reset_index(drop=True)移除groupby生成的多级索引,让结果结构与原DataFrame完全一致。
备选优化方案
如果想先过滤掉无数据的日期分组再采样,也可以这样写:
# 先过滤空分组,再执行采样 sampled_df = ( df.groupby(pd.Grouper(key='time', freq='D')) .filter(lambda x: len(x) > 0) .groupby(pd.Grouper(key='time', freq='D')) .apply(lambda x: x.sample(n=min(len(x), 10))) .reset_index(drop=True) )
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

