Pandas - 完全基于DataFrame的标签平衡(balance)方法

Posted SpikeKing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas - 完全基于DataFrame的标签平衡(balance)方法相关的知识,希望对你有一定的参考价值。

完全基于Pandas - DataFrame的标签平衡(balance)方法:

  1. 获取所有标签中(groupby),标签中样本数量最大值(size().max())。
  2. 遍历全部标签(df[label_tag].unique()),重采样(resample),都平衡到标签中样本数量最大值(n_samples)。
  3. 将这些平衡之后的标签,连接(concat)到一起,组成完整的数据。
  4. 根据列名,排序(sort_values),数据重置索引(reset_index),否则会出现重复。

其他,固定值降采样,用于mini数据集,参考:

df_train.groupby('level').apply(lambda x: x.sample(n=3, random_state=42)).reset_index(drop=True)

源码:

def balance_labels_df(df, label_tag):
    """
    将df中的标签平衡,以最大值进行上采样
    @param df: df文件
    @param label_tag: 标签tag
    @return: 上采样之后的标签
    """
    group_level = df.groupby(label_tag)
    n_samples = group_level.size().max()
    df_list = []
    for level in df[label_tag].unique():
        sub_upsampled = resample(df[df[label_tag] == level],
                                 replace=True,  # sample with replacement
                                 n_samples=n_samples,  # to match majority class
                                 random_state=42)
        df_list.append(sub_upsampled)
    df_upsampled = pd.concat(df_list)
    df_upsampled = df_upsampled.sort_values(by=list(df_upsampled.columns))  # 根据列名排序
    df_upsampled = df_upsampled.reset_index(drop=True)  # drop抛弃之前标签
    return df_upsampled

测试结果:

0    450
2    198
1     90
3     84
4     82
Name: level, dtype: int64

4    450
3    450
2    450
1    450
0    450
Name: level, dtype: int64

         batch   plate     img   compound  concentration duration  luciferase  level  split
0  20220602_11  plate1  r01c01  coat OKT3           20.0       6h     1394700      4  train
1  20220602_11  plate1  r01c01  coat OKT3           20.0       6h     1394700      4  train
2  20220602_11  plate1  r01c01  coat OKT3           20.0       6h     1394700      4  train
3  20220602_11  plate1  r01c02  coat OKT3           10.0       6h     1132400      3  train
4  20220602_11  plate1  r01c02  coat OKT3           10.0       6h     1132400      3  train

参考:

以上是关于Pandas - 完全基于DataFrame的标签平衡(balance)方法的主要内容,如果未能解决你的问题,请参考以下文章

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

pandas中DataFrame的查询方法

pandas.DataFrame学习系列1——定义及属性

pandas笔记

大数据清洗3(pandas - 基本数据结构)