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

DataFrame条件下采样:按value区间各保留300行

按数值区间对DataFrame进行下采样

需求说明

现有如下格式的DataFrame:

Id  feat1 value
c1   c22     51
c2   c12     83
c3   d31     42
c4   a19     110
c5   d44     56
...   ...     ...

其中value列取值范围为[40,240],需要按10为间隔划分区间(如40-50、50-60……230-240),每个区间保留最多300行数据(区间内数据不足300行时保留全部)。

实现方案

  • 添加区间标签:使用pd.cut()函数给value列生成对应的区间分组标签,设置区间步长为10,覆盖40到240的全部取值范围。
  • 分组采样:以生成的区间标签为分组键,对每个分组执行采样操作——如果组内数据行数≥300,就随机抽取300行;如果不足300行,直接保留全部数据。

示例代码:

import pandas as pd

# 假设你的原始数据集存储在df中
# 1. 生成区间分组列,左闭右开区间(如[40,50)对应40≤value<50)
df['value_bin'] = pd.cut(df['value'], bins=range(40, 241, 10), right=False)

# 2. 按区间分组并采样
sampled_df = df.groupby('value_bin', group_keys=False).apply(
    lambda group: group.sample(n=300, random_state=42) if len(group) >= 300 else group
)

# 可选:删除临时添加的区间列,恢复原数据结构
sampled_df = sampled_df.drop('value_bin', axis=1)

细节说明

  • range(40,241,10)生成的区间刚好覆盖40到240的所有取值,确保没有数据被遗漏。
  • right=False设置区间为左闭右开,和你示例中的区间划分逻辑一致(比如51会被分到50-60区间)。
  • random_state=42用于固定采样的随机种子,保证每次运行得到相同的采样结果,不需要的话可以移除该参数。
  • group_keys=False避免分组标签被添加到结果的索引中,保持原DataFrame的索引结构不变。

内容的提问来源于stack exchange,提问作者Kathan Vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:01:14