Pandas - 完全基于DataFrame的标签平衡(balance)方法
Posted SpikeKing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas - 完全基于DataFrame的标签平衡(balance)方法相关的知识,希望对你有一定的参考价值。
完全基于Pandas - DataFrame的标签平衡(balance)方法:
- 获取所有标签中(groupby),标签中样本数量最大值(size().max())。
- 遍历全部标签(df[label_tag].unique()),重采样(resample),都平衡到标签中样本数量最大值(n_samples)。
- 将这些平衡之后的标签,连接(concat)到一起,组成完整的数据。
- 根据列名,排序(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 : balancing data
- Python - Pandas, Resample dataset to have balanced classes
- Sample Pandas dataframe based on values in column
- Sort rows or columns in Pandas Dataframe based on values
- How to Drop Index Column of a Pandas DataFrame
- How to get column names in Pandas dataframe
- pandas.DataFrame.reset_index
以上是关于Pandas - 完全基于DataFrame的标签平衡(balance)方法的主要内容,如果未能解决你的问题,请参考以下文章
Pandas笔记 · DataFrame.loc()和DataFrame.iloc()