Pandas:筛选DataFrame中指定列值计数与少数类相等的行
下采样至少数类数量实现类别平衡
方法一:分组采样(通用写法)
这种方法适用于Target包含多个类别的场景,自动将所有类别采样至少数类的样本数量:
import pandas as pd # 获取少数类的样本数量 min_sample_count = df['Target'].value_counts().min() # 按Target分组后对每个类别采样,少数类保留全部数据,多数类随机采样至目标数量 balanced_df = df.groupby('Target').apply( lambda group: group.sample(n=min_sample_count, random_state=42) ).reset_index(drop=True) # 输出结果 print(balanced_df) print(balanced_df['Target'].value_counts())
方法二:手动分离采样(直观写法)
如果只有两类数据,可手动分离后单独处理,逻辑更清晰:
# 分离Target为0和1的数据集 target_0 = df[df['Target'] == 0] target_1 = df[df['Target'] == 1] # 对多数类(Target=0)随机采样2个样本(与少数类数量一致) target_0_sampled = target_0.sample(n=2, random_state=42) # 合并采样后的多数类与全部少数类数据 balanced_df = pd.concat([target_0_sampled, target_1]).reset_index(drop=True) # 输出结果 print(balanced_df) print(balanced_df['Target'].value_counts())
补充说明
random_state=42用于固定随机采样结果,保证每次运行得到相同的样本集;若不需要固定结果,可直接删除该参数。reset_index(drop=True)用于重置合并后DataFrame的索引,避免原索引混乱。
内容的提问来源于stack exchange,提问作者Movilla
相关产品推荐
相关产品推荐

