使用大熊猫以条件随机丢弃行

时间:2018-08-03 12:14:47

标签: python pandas

我有一个不平衡的数据集,例如:

tag    #elements    
a      1500
b      3250
c      320   
d      260

它导致过度拟合。我想随机消除某些具有特定名称的行,以便我的数据集更加平衡。例如,消除后我想要这样的东西;

tag    #elements    
a      300
b      300
c      300
d      260

但是,我建议您使用它,如果可能的话,可以在某些范围内随机消除它们,例如元素的最低数量(在我们的例子中为260个)加上50个左右(我不知道正确的执行方式)。因此,消除后元素的数量将如下所示:

tag    #elements    
a      307
b      286
c      275
d      260

请注意,这些数字与标签数相对应。数据集的总长度为5330。我想减少它。

先谢谢了。

1 个答案:

答案 0 :(得分:0)

使用sample,您可以这样操作:

#create a dataframe like yours
df = pd.DataFrame({'tag':['a']*1500 + ['b']*3250 + ['c']*320 + ['d']*260,'col1':range(5330)})
min_size = df.groupby('tag').count().min()[0] #here it's 260
max_plus = 50
df_sample = (df.groupby('tag',as_index=False)
               .apply(lambda x: x.sample(min(len(x), min_size + np.random.randint(max_plus,size=1))))
               .reset_index(drop=True)) # this is not mandatory, it depends of your needs

然后例如我的尝试:

print (df_sample.groupby('tag').count())
Out[292]: 
     col1
tag      
a     270
b     299
c     287
d     260