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
相关产品推荐
相关产品推荐

